0

これは興味深い問題です。説明できるよう最善を尽くします。ご不明な点がございましたら、お尋ねください。

JAVA クライアントと通信することになっている WCF サービスを作成しました。このサービスは、最初に WSDL からコントラクトによって作成されました。現在、WCF テスト クライアントによると、すべてが機能し、PHP クライアントでのテストも同様に機能します。しかし、Java クライアントに関して言えば、要求メッセージとそれに続く応答メッセージが返されません。null オブジェクトの SOAP エラーが発生します。問題があると思うのは次のとおりです。

XSD と WSDL によると、私は取得する予定の DateTime 値を持っています。クライアントからのこの dateTime 値の形式は、2012-01-01T12:00:00.00Z です。残念ながら、この入力は組み込みの .NET 日時では有効ではありません。したがって、これを回避するために、コードを変更して文字列データ型を取り込み、その文字列を 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);
                }
            }
4

1 に答える 1

0

この特定の問題については、最初は問題だと思っていたものではありませんでした。まず、C# コードの要求操作で WrapperNames を使用する必要があり、使用した名前が正しくありませんでした。

次に、SOAP ボディ エンコーディングを指定する必要がありました。これは、インターフェイス レイヤー内で行う必要がありました。

 [XmlSerializerFormatAttribute(SupportFaults=true, Style=OperationFormatStyle.Document ,Use=OperationFormatUse.Literal)]
于 2012-02-28T01:04:58.970 に答える