2012-02-11 1 views
0

Это интересная проблема, и я сделаю все возможное, чтобы объяснить. Если у вас есть какие либо вопросы, пожалуйста спрашивайте.Проблемы с WCF-сервисом с Java-клиентом

Я написал службу WCF, которая должна связываться с клиентом JAVA. Эта услуга была создана по контракту сначала из WSDL. Теперь, согласно тестовому клиенту WCF, все работает, даже работает тестирование на PHP-клиенте. Но когда дело доходит до клиента Java, сообщения запроса и последующие сообщения ответа не возвращаются: я получаю ошибку SOAP с нулевым объектом. Вот, я думаю, проблема кроется:

Согласно XSD и WSDL, у меня есть значение DateTime, которое, как я полагаю, займет. Это значение dateTime от клиента имеет форму: 2012-01-01T12: 00 : 00.00Z. К сожалению, этот ввод недействителен со встроенным .NET datetime. Итак, чтобы обойти это, я изменил свой код, чтобы взять строковый тип данных, преобразовать эту строку в Datetime, чтобы отправить ее в базу данных, получить ответ от базы данных в этой DateTime и преобразовать ее обратно в строку для ответа чтобы вернуть значение, подобное тому, которое было введено.

Я построил регистратор, чтобы проверить, были ли сообщения отправлены и из моей службы wcf. Из этого я обнаружил, что сообщения от клиента не были получены. Мое единственное предположение, что это из-за проблемы с датой.

Есть ли способ взять дату DateTime в формате: 2012-01-01T12: 00: 00.000Z? Если я могу, то это будет означать, что запрос будет соответствовать моему типу данных и, возможно, он будет работать.

Вот код:

public partial class findSeatsRequest 
{ 

    [MessageBodyMemberAttribute(Namespace="http://soa.cs.uwf.edu/airlineData", Order=0, Name="departAirport")] 
    public string DepartAirport; 

    [MessageBodyMemberAttribute(Namespace="http://soa.cs.uwf.edu/airlineData", Order=1, Name="arriveAirport")] 
    public string ArriveAirport; 

    [MessageBodyMemberAttribute(Namespace="http://soa.cs.uwf.edu/airlineMessage", Order=2, Name="earliestDepartTime")] 
    public string EarliestDepartTime; 

    [MessageBodyMemberAttribute(Namespace="http://soa.cs.uwf.edu/airlineMessage", Order=3, Name="latestDepartTime")] 
    public string LatestDepartTime; 

    [MessageBodyMemberAttribute(Namespace="http://soa.cs.uwf.edu/airlineMessage", Order=4, Name="minimumSeatsAvailable")] 
    public int MinimumSeatsAvailable; 

    [MessageBodyMemberAttribute(Namespace="http://soa.cs.uwf.edu/airlineMessage", Order=5, Name="maximumFlightsToReturn")] 
    public int MaximumFlightsToReturn; 

    public findSeatsRequest() 
    { 
    } 

    public findSeatsRequest(string departAirport, string arriveAirport, string earliestDepartTime, string latestDepartTime, int minimumSeatsAvailable, int maximumFlightsToReturn) 
    { 
     this.DepartAirport = departAirport; 
     this.ArriveAirport = arriveAirport; 
     this.EarliestDepartTime = earliestDepartTime; 
     this.LatestDepartTime = latestDepartTime; 
     this.MinimumSeatsAvailable = minimumSeatsAvailable; 
     this.MaximumFlightsToReturn = maximumFlightsToReturn; 
    } 
} 


    public partial class findSeatsResponse 
{ 

    [MessageBodyMemberAttribute(Namespace="http://soa.cs.uwf.edu/airlineData", Order=0, Name="flight")] 
    [XmlElementAttribute("flight")] 
    public System.Collections.Generic.List<flightType> Flight; 

    public findSeatsResponse() 
    { 
    } 

    public findSeatsResponse(System.Collections.Generic.List<flightType> flight) 
    { 
     this.Flight = flight; 
    } 
} 

     public virtual findSeatsResponse findSeats(findSeatsRequest request) 
    { 
     string departAirport = request.DepartAirport; 
     string arriveAirport = request.ArriveAirport; 
     string earliestDepartTime = request.EarliestDepartTime; 
     string latestDepartTime = request.LatestDepartTime; 
     int minimumSeatsAvailable = request.MinimumSeatsAvailable; 
     int maximumFlightsToReturn = request.MaximumFlightsToReturn; 
     SqlCommand cmd = null; 
     DataSet ds = new DataSet(); 
     List<flightType> flight = new List<flightType>(); 
     EventLogger log = new EventLogger(); 

     findSeatsRequest inValue = new findSeatsRequest(); 
     inValue.DepartAirport = departAirport; 
     inValue.ArriveAirport = arriveAirport; 
     inValue.EarliestDepartTime = earliestDepartTime; 
     inValue.LatestDepartTime = latestDepartTime; 
     inValue.MinimumSeatsAvailable = minimumSeatsAvailable; 
     inValue.MaximumFlightsToReturn = maximumFlightsToReturn; 

     string latestT = inValue.LatestDepartTime.Replace("T", " "); 
     string latestZ = latestT.Replace("Z", ""); 
     DateTime _latestDepartTime = DateTime.ParseExact(latestZ, "yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture); 

     string earliestT = inValue.EarliestDepartTime.Replace("T", " "); 
     string earliestZ = earliestT.Replace("Z", ""); 
     DateTime _earliestDepartTime = DateTime.ParseExact(earliestZ, "yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture); 

     log.WriteToDataBase(DateTime.Now, "FindSeats", 1, "This is the request: " + inValue); 


     //Check Maximum Flights 
     if (inValue.MaximumFlightsToReturn > 100 | inValue.MaximumFlightsToReturn < 0) 
     { 
      throw new FaultException(
       "You cannot select more than 100 flights to return, or the maximum flights to return is negative.", 
       new FaultCode("OutOfRange")); 
     } 

     // Check Minimum Seats Available. 
     if (inValue.MinimumSeatsAvailable < 0) 
     { 
      throw new FaultException(
       "You minimum seats available cannot be negative.", 
       new FaultCode("OutOfRange")); 
     } 

     // Check for valid Departure Airport 
     if (departAirport != null && departAirport != "ANY") 
     { 
      try 
      { 
       string strConn = ConfigurationManager.ConnectionStrings["ConnectionString"].ToString(); 
       SqlConnection conn = new SqlConnection(strConn); 

       conn.Open(); 

       string check = "SELECT DepartAirport FROM Flight WHERE DepartAirport='" + departAirport + "'"; 
       cmd = new SqlCommand(check, conn); 
       cmd.CommandText = check; 
       SqlDataReader depAirport; 
       depAirport = cmd.ExecuteReader(); 

       if (depAirport.HasRows == false) 
       { 
        throw new FaultException(
         "Invalid Airport code used.", 
         new FaultCode("Invalid Text Entry")); 
       } 
      } 
      finally 
      { 
       if (cmd != null) 
        cmd.Dispose(); 
      } 
     } 

     // Check for valid Arrival Airport 
     if (arriveAirport != null && arriveAirport != "ANY") 
     { 
      try 
      { 
       string strConn = ConfigurationManager.ConnectionStrings["ConnectionString"].ToString(); 
       SqlConnection conn = new SqlConnection(strConn); 

       conn.Open(); 

       string check = "SELECT ArriveAirport FROM Flight WHERE ArriveAirport='" + arriveAirport + "'"; 
       cmd = new SqlCommand(check, conn); 
       cmd.CommandText = check; 
       SqlDataReader arrAirport; 
       arrAirport = cmd.ExecuteReader(); 

       if (arrAirport.HasRows == false) 
       { 
        throw new FaultException(
         "Invalid Airport code used.", 
         new FaultCode("Invalid Text Entry")); 
       } 
      } 
      finally 
      { 
       if (cmd != null) 
        cmd.Dispose(); 
      } 
     } 

     try 
     { 
      string strConn = ConfigurationManager.ConnectionStrings["ConnectionString"].ToString(); 
      SqlConnection conn = new SqlConnection(strConn); 

      conn.Open(); 

      cmd = new SqlCommand("usp_NewFindSeats", conn); 
      cmd.CommandType = CommandType.StoredProcedure; 

      cmd.Parameters.Add(new SqlParameter("@DepartureAirport", inValue.DepartAirport)); 
      cmd.Parameters.Add(new SqlParameter("@ArrivalAirport", inValue.ArriveAirport)); 
      cmd.Parameters.Add(new SqlParameter("@EarliestDepTime", _earliestDepartTime)); 
      cmd.Parameters.Add(new SqlParameter("@LatestDepTime", _latestDepartTime)); 
      cmd.Parameters.Add(new SqlParameter("@minSeatsAvailable", inValue.MinimumSeatsAvailable)); 
      cmd.Parameters.Add(new SqlParameter("@maxFlightsRequested", inValue.MaximumFlightsToReturn)); 

      using (SqlDataReader sqlReader = cmd.ExecuteReader()) 
      { 
       while (sqlReader.Read()) 
       { 
        flightType Flight = new flightType(); 

        Flight.FlightId = sqlReader.GetString(0); 
        Flight.DepartAirport = sqlReader.GetString(1); 
        Flight.ArriveAirport = sqlReader.GetString(2); 
        Flight.DepartTime = sqlReader.GetDateTime(3).ToString("yyyy-MM-ddTHH:mm:ss.fffZ"); 
        Flight.ArriveTime = sqlReader.GetDateTime(4).ToString("yyyy-MM-ddTHH:mm:ss.fffZ"); 
        Flight.FlightSeatsAvailable = sqlReader.GetInt32(5); 
        Flight.FlightSeatPriceUSD = sqlReader.GetDouble(6); 

        flight.Add(Flight); 
       } 
      } 
+1

Нулевые данные в веб-службе обычно означают пустые пространства имен. Посмотрите на сетевой трафик с помощью [Fiddler] (http://fiddler2.com) или некоторые из них, чтобы увидеть разницу между клиентом PHP и клиентом Java. –

+0

Я тоже подумал, что забыл упомянуть об этом, но у меня есть еще одна служебная операция, которая отлично работает с клиентом JAVA. Итак, я думаю, что мое устраняет проблему с неправильным пространством имен? – CalvinBlount

+0

Нет, это не исключает его. Пожалуйста, взгляните на сетевой трафик. –

ответ

0

Для этой конкретной проблемы, этот вопрос не было ничего, я думал, что это было в самом начале. Во-первых, пришлось использовать WrapperNames в моих запросах на код C#, и имена, которые я использовал, были неправильными.

Во-вторых, мне нужно было указать кодировку SOAP Body, которую я должен был выполнять в своем интерфейсном слое.

[XmlSerializerFormatAttribute(SupportFaults=true, Style=OperationFormatStyle.Document ,Use=OperationFormatUse.Literal)]