Проблемы службы WCF с клиентом Java - PullRequest
0 голосов
/ 12 февраля 2012

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

Я написал службу 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 Ответ

0 голосов
/ 28 февраля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...