2012-02-11 14 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サービスとの間で送受信されているかどうかを確認するためのロガーを構築しました。それで、クライアントからのメッセージが受信されていないことを確認しました。私の唯一の推測は、日時の問題のためです。

2012-01-01T12:00:00.000Zの形式でdateTimeデータ型を取り込む方法はありますか?私ができるなら、それは要求が私のデータ型と一致することを意味し、おそらくそれは動作します。ここで

は、いくつかのコードは次のとおりです。この特定の問題については

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

通常、WebサービスのNULLデータは混乱した名前空間を意味します。 [Fiddler](http://fiddler2.com)などでネットワークトラフィックを調べると、PHPクライアントとJavaクライアントの違いを見ることができます。 –

+0

私はそれも考えていたことを忘れていましたが、JAVAクライアントでうまく動作する別のサービス操作があります。だから、私は私が無効な名前空間の問題を排除すると思いますか? – CalvinBlount

+0

いいえ、それを排除しません。ネットワークのトラフィックを見てください。 –

答えて

0

、問題は、私はそれが最初に思ったものではなかったです。まず、C#コードのリクエスト操作でWrapperNamesを使用しなければならず、使用した名前が正しくありませんでした。

第2に、インターフェースレイヤー内で行う必要があったSOAP Bodyエンコーディングを指定する必要がありました。

[XmlSerializerFormatAttribute(SupportFaults=true, Style=OperationFormatStyle.Document ,Use=OperationFormatUse.Literal)] 
関連する問題