Как вызвать службу WCF REST / JSON из клиентского приложения

#c# #wcf #json #rest

#c# #wcf #json #rest

Вопрос:

У меня есть служба WCF REST / JSON, я создаю ее с помощью этого шаблона. В моем сервисе у меня есть метод

  [WebInvoke(UriTemplate = "Create", Method = "*",RequestFormat = WebMessageFormat.Json,BodyStyle = WebMessageBodyStyle.Bare)]
    public void Create(PictureData pictureData)
    {
        var context = new EFDBContext();
        context.PictureData.Add(pictureData);
        context.SaveChanges();
    }
  

PictureData это мои данные сущности, которые я пытаюсь сохранить в БД через EF.

В моем клиентском приложении WPF я пытаюсь вызвать этот метод:

 using (var client = new HttpClient("http://localhost:8080/ScreenPictureService/Create"))
        {
            var dataContract = HttpContentExtensions.CreateJsonDataContract(pictureData);
            client.Post("", dataContract);
        }
  

Но ничего не происходит

  • Я также пытаюсь использовать Method=»POST» в атрибуте WebInvoke
  • Также я пытаюсь использовать адрес без «Create» в HttpClient, а затем использовать его в клиенте.Сообщение в первом параметре

Обновить

После того, как я попробую это

 var dataContract = HttpContentExtensions.CreateJsonDataContract(pictureData, typeof (PictureData));
        var client = new HttpClient();
        using(var response = client.Post("http://localhost:8080/ScreenPictureService/Create", dataContract))
        {
            response.EnsureStatusIs(HttpStatusCode.OK);
        }
  

Я получил неверный запрос 400

ОБНОВЛЕНИЕ 2 Я нашел свои проблемы:

  • Я использую JSON.NET сериализовать мой объект, и когда я получаю массив байтов, он преобразуется в формат base64, но мой сервис ожидает массив байтов — он решил использовать список байтов.

  • И вторая проблема — я пытаюсь получить скриншот моего десктопа с высоким разрешением, и у меня тот же ответ (неверный запрос 400), если я изменю разрешение изображения на 800×600, сервис работает хорошо, и возникает мой вопрос — как увеличить квоту сообщения запроса. Я пытаюсь использовать внутри раздела standardEndpoint (web.config)

readerQuotas maxArrayLength=»2147483647″ maxBytesPerRead=»2147483647″ maxDepth=»2147483647″ maxNameTableCharCount=»2147483647″ MaxStringContentLength=»2147483647″

Но это не работает

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

1. Что вы подразумеваете под тем, что ничего не происходит? Есть ли какие-либо ошибки? Вы проверили журнал событий?

2. Я имею в виду, что никаких ошибок получено не было.

Ответ №1:

Вы пробовали отслеживать точный запрос / ответ с помощью такого инструмента, как Fiddler? Возможно, ваш пост не такой, каким вы его ожидаете?

Знает ли служба WCF, что нужно принимать REST? Если вы не используете WCF.WebAPI обычно есть ужасные привязки wcf для настройки, например:

 <service name="MyWcfServiceWebRole.xyz.IAbcService">
    <endpoint address="" behaviorConfiguration="webby" binding="webHttpBinding" bindingConfiguration="RestBinding" contract="MyWcfServiceWebRole.xyz.IAbcService" />
</service>

<behaviors>
   <endpointBehaviors>
      <behavior name="webby">
         <webHttp />
      </behavior>
   </endpointBehaviors>
</behaviors>
  

Работает ли простой REST?

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

1. Я пытаюсь отслеживать с помощью Fiddler, он также получает неверный запрос 400. Да, простой REST работает хорошо.

Ответ №2:

Я предлагаю гамак, это просто и хорошо работает.

Ответ №3:

Ошибка 400 Bad request может быть вызвана многими возможными причинами. Попробуйте включить трассировку в своей службе. Это можно сделать, перейдя по ссылке здесь.

Кроме того, если у вас есть конфигурационный файл с конфигурацией, убедитесь, что у вас есть разделенные значения readerQuotas, как показано ниже, если вы используете webHttpBinding:

 <webHttpBinding>
    <binding name="RestBinding">
      <readerQuotas maxStringContentLength="5242880" maxArrayLength="16384"
        maxBytesPerRead="4096" />
      <security mode="None">
        <transport clientCredentialType="None" />
      </security>
    </binding>
  </webHttpBinding>
  

Если вы используете REST API с определением вашего сервиса с маршрутами в global.asax и используете стандартную конечную точку, используйте следующее:

 <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true">
    <readerQuotas maxStringContentLength="5242880" maxArrayLength="4194304"
            maxBytesPerRead="4194304" />
</standardEndpoint>