Может ли кто-нибудь помочь мне вручную создать http-запрос для этого веб-сервиса на основе отдыха? - PullRequest
1 голос
/ 21 июня 2011

У меня есть веб-сервис WCF на основе REST;

Контракт:

[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Xml)]
string EchoWithPost(string message);

Сообщение:

public string EchoWithPost(string s)
{
    return "ECHO with POST : You said " + s;
}

Я использовал фабрику веб-каналов, чтобы получить ответ через POST, и она работает. Я использовал wireshark, чтобы нажать на сообщение, и я вижу некоторые важные вещи:

1) Этот xml отправлен 2) Тип контента

Из этого я построил следующую логику запроса:

        //5) manually post to the REST service
        //Create a request using a URL that can receive a post. 
        WebRequest request = WebRequest.Create(urlOfService + "/rest/EchoWithPOST");
        // Set the Method property of the request to POST.
        request.Method = "POST";
        // Create POST data and convert it to a byte array.


        string postData = "<EchoWithPost xmlns="http://tempuri.org"><message>Hello</message><EchoWithPost>";



        byte[] byteArray = Encoding.UTF8.GetBytes(postData);
        // Set the ContentType property of the WebRequest.
        request.ContentType = "application/xml";
        // Set the ContentLength property of the WebRequest.
        request.ContentLength = byteArray.Length;
        // Get the request stream.
        Stream dataStream = request.GetRequestStream();
        // Write the data to the request stream.
        dataStream.Write(byteArray, 0, byteArray.Length);
        // Close the Stream object.
        dataStream.Close();
        // Get the response.
        WebResponse response = request.GetResponse();
        // Display the status.
        Console.WriteLine(((HttpWebResponse)response).StatusDescription);
        // Get the stream containing content returned by the server.
        dataStream = response.GetResponseStream();
        // Open the stream using a StreamReader for easy access.
        StreamReader reader = new StreamReader(dataStream);
        // Read the content.
        string responseFromServer = reader.ReadToEnd();
        // Display the content.
        Console.WriteLine(responseFromServer);
        // Clean up the streams.
        reader.Close();
        dataStream.Close();
        response.Close();

Однако, когда я попал в строку, которая говорит:

dataStream = response.GetResponseStream ();

Я получаю следующую ошибку:

«Удаленный сервер возвратил ошибку: (400) неверный запрос»

Может ли кто-нибудь помочь мне с тем, что мне нужно сделать, поскольку мне нужно рассказать людям, как вручную создать запрос POST для взаимодействия с этим сервисом на основе REST.

Любая помощь, высоко ценимая, не вижу, что еще я могу попробовать.

Ответы [ 4 ]

1 голос
/ 22 июня 2011

Загрузить этот инструмент http://www.fiddler2.com/fiddler2/

попробуйте вызвать метод rest и посмотреть необработанные данные (ответ на запрос) в fiddler, вы получите точную информацию об ошибке

1 голос
/ 22 июня 2011

Я сделал несколько небольших изменений, поэтому я просто опубликую все это.Надеюсь, это работает для вас.Кроме того, я не добавлял десериализацию, полагая, что вы можете справиться с этим, если преодолеете ошибку HTTP 400.

Отличным инструментом, который поможет вам отладить эти ситуации, является SoapUI.Просто установите «Web TestCase», и вы сможете создавать свои собственные POST-запросы и отслеживать данные, которые возвращаются назад и вперед.

-Vito

Интерфейс:

    [OperationContract]
    [WebInvoke(UriTemplate = "EchoWithPost", Method="POST", BodyStyle = WebMessageBodyStyle.Wrapped, RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml)]
    string EchoWithPost(string message);

Сервис:

    public string EchoWithPost(string s)
    {
        return "ECHO with POST : You said " + s;
    }

Клиент:

string urlOfService = "http://somewhere.com/RestService.svc/EchoWithPost";
string postData = "<EchoWithPost xmlns=\"http://tempuri.org/\"><message>Vito</message></EchoWithPost>";
byte[] byteArray = Encoding.UTF8.GetBytes(postData);

WebRequest request = WebRequest.Create(urlOfService);
request.Method = "POST";
request.ContentType = "application/xml;";
request.ContentLength = byteArray.Length;
Stream dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();

WebResponse webResponse = request.GetResponse();

// Output raw string result
string rawStringResult = new StreamReader(webResponse.GetResponseStream()).ReadToEnd();
HttpContext.Current.Response.Write("\r\n" + rawStringResult);

web.config:

1 голос
/ 21 июня 2011

Если тип содержимого говорит о том, что вы отправляете XML, то вам не следует экранировать свой XML, чтобы отправить его в службу - по крайней мере, без переноса сообщения; если у вас есть символы, которые нужно экранировать в контенте (тексте), вам нужно их экранировать. Измените postData на строку ниже, и она должна работать.

string postData = "<EchoWithPost xmlns=\"http://tempuri.org\"><message>Hello &amp; goodbye</message></EchoWithPost>";  
0 голосов
/ 21 июня 2011

Хорошо, Pete2k, я бы сказал, что без запуска вашего сервиса это может занять некоторое время, чтобы восстановить это. Вы используете проект WCF 4.0 REST? В этом случае на странице справки должна быть показана информация о запросах.

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