Неверный запрос RestSharp Windows Phone 7

#silverlight #web-services #windows-phone-7 #restsharp

#silverlight #веб-сервисы #windows-phone-7 #restsharp

Вопрос:

Я пытался создать веб-службу WCF, которая вводит определенный набор данных в базу данных и может использоваться в Windows Phone 7. В файле конфигурации есть две конечные точки: json и soap. Вот код для них обоих:

 <service name="LiveAndesWCF.SightingServiceRest" behaviorConfiguration="MetadataBehavior">
    <endpoint address="soap" binding="basicHttpBinding" contract="LiveAndesWCF.ISightingServiceRest"/>
    <endpoint address="json" behaviorConfiguration="WebBehavior" binding="webHttpBinding" contract="LiveAndesWCF.ISightingServiceRest"/>
</service>
...
<bindings>
    <basicHttpBinding>
        <binding maxReceivedMessageSize="99999999" closeTimeout="00:02:00" openTimeout="00:02:00" receiveTimeout="00:10:00" sendTimeout="00:02:00">
            <readerQuotas maxArrayLength="76384000" maxStringContentLength="2147483647"/>
        </binding>
    </basicHttpBinding>
        <webHttpBinding>
            <binding maxReceivedMessageSize="99999999" closeTimeout="00:02:00" openTimeout="00:02:00" receiveTimeout="00:10:00" sendTimeout="00:02:00">
                <readerQuotas maxArrayLength="76384000" maxStringContentLength="2147483647"/>
            </binding>
        </webHttpBinding>
</bindings>
  

Теперь я развернул службу на сервере, загрузил ее метаданные с помощью slsvcutil.exe и сохранил как файл кода, так и файл ServiceReferenceConfig в проекте. Теперь slsvcutil генерирует конфигурацию только для конечной точки soap.

Теперь я пытаюсь использовать службу, используя библиотеку RestSharp, используя следующий код:

 public static void sendSighting()
{
    string URL = "http://liveandesor.web711.discountasp.net/wcf/SightingServiceRest.svc/json/SaveNewSightingRest";

    var request = new RestRequest(Method.POST);

    var client = new RestClient(URL);

    request.AddHeader("Accept", "application/json");
    request.AddHeader("Host", "liveandesor.web711.discountasp.net");
    request.AddHeader("Content-type", "application/json");

    JObject json = new JObject();

    json.Add("UserId", "letroll");
    json.Add("Location", "TEST");
    json.Add("Longitude", 50);
    json.Add("Latitude", 50);
    json.Add("Comment", "TEST");
    json.Add("SpeciesId", 438);
    json.Add("_Date", new DateTime(2011, 8, 12));
    json.Add("DateString", (new DateTime(2011, 8, 12)).ToString());
    json.Add("SightingTypeId", 1);
    json.Add("Quantity", 1);
    json.Add("AgeId", 1);
    json.Add("SexId", 1);
    json.Add("PhotoURL", new JArray(new List<String>()));
    json.Add("Request", false);
    json.Add("Visibility", false);
    json.Add("SightingStateId", 1);
    json.Add("Created_at", new DateTime());
    json.Add("Updated_at", new DateTime());

    String jason = json.ToString();

    try
    {
        //request.AddObject(json);
        request.AddBody(jason);

        RestResponse resource;

        client.ExecuteAsync(request, (response) =>
        {
            resource = response;
            string content = resource.Content;
            string status_code = resource.StatusCode.ToString();
            string response_status = resource.ResponseStatus.ToString();
        });
    }
    catch (Exception e)
    {
        string error = "Error: "   e.ToString()   "n. Stack Trace: "   e.StackTrace;
        Console.WriteLine(error);
    }
}
  

Если я попытаюсь использовать URL-адрес, указанный в примере кода, я получу сообщение об ошибке «конечная точка не найдена», чего и следовало ожидать. Однако, если я попытаюсь использовать конечную точку SOAP через URL http://liveandesor.web711.discountasp.net/wcf/SightingServiceRest.svc/soap/SaveNewSightingRest , я просто получаю код состояния «Плохой запрос».

Почему это происходит? Есть ли какой-нибудь способ заставить его работать? Если это может быть полезно, каждый раз, когда я нажимаю на ссылку, которую я предоставил для службы SOAP, я просто получаю пустой экран.

Спасибо за помощь!

Комментарии:

1. Похоже, проблема заключается в самой службе, потому что я пытаюсь получить доступ к конечной точке с помощью запроса URL, но он выдает ошибку 400 Bad Request. 🙁

2. Я сделаю это прямо сейчас и добавлю его в редактирование исходного вопроса 🙂

Ответ №1:

Поэтому мне не нужно публиковать в комментариях:

Как выглядит ваше тело в fiddler, с помощью RestSharp вы можете создать poco и просто, RestRequest.AddBody(MyPoco);

Я думаю, что URL:

  string URL = "http://liveandesor.web711.discountasp.net/wcf/SightingServiceRest.svc/json/SaveNewSightingRest";
  

должно быть:

 string URL = "http://liveandesor.web711.discountasp.net/wcf/SightingServiceRest.svc";
  

и затем:

 RestRequest.Resource = "json/SaveNewSightingRest";
  

Обновить:
Я скопировал ваш код, изменив URL-адрес / ресурс, и в fiddler тело выглядит так: <String /> Чтобы уточнить, это отправляемое тело, поэтому вы ожидаете увидеть json, который пытаетесь отправить.

с ошибкой:

Сервер обнаружил ошибку при обработке запроса. Сообщение об исключении: «Невозможно десериализовать тело XML с корневым именем ‘String’ и корневым пространством имен » (для операции ‘SaveNewSightingRest’ и contract (‘ISightingServiceRest’, ‘http://tempuri.org /’)) с использованием DataContractSerializer. Убедитесь, что тип, соответствующий XML, добавлен в коллекцию известных типов службы.

Комментарии:

1. Дерек: Это было именно то, что мне было нужно!! У меня возникла ошибка при отправке информации на сервер, в частности, с пустым строковым массивом. В любом случае, я не могу сказать вам, насколько вы помогли. Я буквально весь день искал ответ. Большое вам спасибо !! : D