Получение HTTP Ошибка 400 Вызов службы WCF через HttpWebRequest - PullRequest
2 голосов
/ 19 марта 2011

У меня есть служба WCF, которую я могу вызвать через jQuery, но я не могу вызвать через HttpWebRequest.Я мог использовать те же самые настройки HttpWebRequest для вызова службы ASMX и раньше, но это моя первая попытка вызова службы WCF.Я предоставил код jQuery и C # HttpWebRequest, чтобы вы могли заметить что-то, что я сделал явно неправильно.

Это мой сломанный код C #, последняя строка выдает ошибку 400

string url = "http://www.site.com/Service/Webapi.svc/GetParts";
string parameters = "{part: 'ABCDE'}";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);

req.Method = "POST";
req.ContentLength = 0;
req.ContentType = "application/json; charset=utf-8";

if (!string.IsNullOrEmpty(parameters))
{
    byte[] byteArray = Encoding.UTF8.GetBytes(parameters);
    req.ContentLength = byteArray.Length;
    Stream dataStream = req.GetRequestStream();
    dataStream.Write(byteArray, 0, byteArray.Length);
    dataStream.Close();
}

HttpWebResponse response = (HttpWebResponse)req.GetResponse();

Это мой рабочий код jQuery

 $.ajax({
    url: '/Service/Webapi.svc/GetParts',
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    type: 'POST',
    data: JSON.stringify({ part: request.term }),
    success: function (data) {
        // Success
    }
});

Вот мои относительные настройки web.config

  <system.serviceModel>
    <behaviors>
      <endpointBehaviors>
        <behavior name="REST">
          <enableWebScript/>
          <webHttp/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
    <services>
      <service name="Webapi">
        <endpoint address="" behaviorConfiguration="REST" binding="webHttpBinding" contract="IWebapi"/>
      </service>
    </services>
  </system.serviceModel>

Вот мой интерфейс службы, я пытался изменить «Метод»на "POST", но это не имело значения.

[ServiceContract]
public interface IWebapi
{
    [OperationContract]
    [WebInvoke(
        Method = "*",
        RequestFormat = WebMessageFormat.Json,
        ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.WrappedRequest)
    ]
    string[] GetParts(string part);
}

Вот моя реализация службы

public string[] GetParts(string part)
{
    return new string[] {"ABC", "BCD", "CDE"};
}

1 Ответ

3 голосов
/ 19 марта 2011

Хорошо, это было далеко от очевидного ранее, но я обнаружил проблему ....

Основной причиной сообщения HTTP Error 400 был неверно отформатированный запрос JSON.В Интернете я нашел статью, в которой говорилось о получении ошибки 400, если тип контента был неправильным (чего не было), поэтому я решил снова просмотреть все элементы в HttpWebRequest.Я обнаружил, что когда JSON-запрос отправлялся через jQuery, он имел следующий формат:

    // Good JSON Formatting
    {"property":"value"}

, но в моем коде выше я использовал

    // Bad JSON Formatting
    {property:"value"}

После внесения этого изменения всеработал.Чтобы этого не случилось, я нашел статью из ScottGu о создании метода расширения ToJSON () с использованием JavaScriptSerializer.Используя этот метод расширения, я придумал следующий код / ​​fix.

  1. Создал объект запроса (свойство должно соответствовать сигнатуре метода, который я вызываю)

    class Request
    {
        public string part {get; set;}
    }
    
  2. Сериализует объект для получения правильного форматирования JSON

    Request request = new Request() { part = "ABC" };
    request.ToJSON();
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...