2012-02-11 5 views
0

이것은 흥미로운 문제이며 설명을 위해 최선을 다할 것입니다. 질문이 있으시면, 물어보십시오.Java 클라이언트의 WCF 서비스 문제

JAVA 클라이언트와 통신하는 것으로 가정되는 WCF 서비스를 작성했습니다. 이 서비스는 WSDL의 계약을 통해 생성되었습니다. 이제 WCF 테스트 클라이언트에 따르면 모든 것이 작동하며 심지어 PHP 클라이언트 테스트도 작동합니다. 그러나 Java 클라이언트의 경우 요청 메시지와 후속 응답 메시지가 반환되지 않습니다. null 객체 SOAP 오류가 발생합니다. 여기에 나는 문제가 있다고 생각했다 :

XSD와 WSDL에 따르면, 내가 가지고 있다고 가정하는 DateTime 값이 있습니다. 클라이언트의 dateTime 값은 다음과 같습니다. 2012-01-01T12 : 00 : 00.00Z. 불행하게도,이 입력은 .NET datetime에 내장되어 있지 않습니다. 따라서이 문제를 해결하기 위해 코드를 변경하여 문자열 데이터 유형을 가져 와서 해당 문자열을 Datetime으로 변환하여 데이터베이스로 보내고 해당 dateTime의 데이터베이스에서 응답을 얻은 다음 응답 문자열을 다시 변환합니다. 입력 된 값과 같은 값을 반환합니다.

메시지가 내 wcf 서비스와주고 받는지 확인하기 위해 로거를 만들었습니다. 그로부터 클라이언트의 메시지가 수신되지 않고 있음을 확인했습니다. 내 유일한 추측은 그것이 datetime 문제 때문입니다.

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

웹 서비스의 Null 데이터는 일반적으로 혼란스러운 네임 스페이스를 의미합니다. [Fiddler] (http://fiddler2.com) 또는 일부와 같은 네트워크 트래픽을보고 PHP 클라이언트와 Java 클라이언트 간의 차이점을 확인하십시오. –

+0

나는 그것을 생각하고 그것을 언급하는 것을 잊어 버렸지 만 JAVA 클라이언트와 잘 작동하는 또 다른 서비스 작업이 있습니다. 그래서, 나는 잘못된 네임 스페이스 문제를 제거한다고 생각합니까? – CalvinBlount

+0

아니요, 제거하지 않습니다. 네트워크 트래픽을 살펴보십시오. –

답변

0

, 문제는 내가 처음에 줄 알았는데 아무것도 아니었다. 첫째, C# 코드의 요청 작업에서 WrapperNames를 사용해야하고 내가 사용한 이름이 올바르지 않습니다.

둘째, 인터페이스 레이어 내에서해야 할 SOAP Body 인코딩을 지정해야했습니다.

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