400 Неправильный запрос при попытке связаться с сервисом WCF с использованием XHR - PullRequest
5 голосов
/ 14 октября 2011

Я делаю веб-службу WCF, которая будет возвращать объект json, но я продолжаю получать ошибку 400 неверных запросов, когда пытаюсь сделать AJAX-вызов:

OPTIONS http://localhost:55658/WebServiceWrapper.svc/GetData?_=1318567254842&value=97            HTTP/1.1
Host: localhost:55658
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
DNT: 1
Connection: keep-alive
Origin: http://localhost:3000
Access-Control-Request-Method: GET
Access-Control-Request-Headers: content-type

HTTP/1.1 400 Bad Request
Server: ASP.NET Development Server/10.0.0.0
Date: Fri, 14 Oct 2011 04:40:55 GMT
X-AspNet-Version: 4.0.30319
Cache-Control: private
Content-Length: 0
Connection: Close

Вот мой AJAX-вызов:

$.ajax({
  contentType: 'application/json',
  url: 'http://localhost:55658/WebServiceWrapper.svc/GetData',
  dataType: 'json',
  data: {
    value: 97
  },
  success: function (data) {
    alert('success' + data);
  },
  error: function(XMLHttpRequest, textStatus, errorThrown) {
    alert('failure' + errorThrown);
  }
});

Вот мое определение службы WCF:

public class WebServiceWrapper : IWebServiceWrapper
{
    public object GetData(int value)
    {
        return new 
        {
            ReturnValue = string.Format("You entered: {0}", value)
        };
    }
}

И его интерфейс:

[ServiceContract]
public interface IWebServiceWrapper
{
    [OperationContract]
    object GetData(int value);
}

Я знаю, что решил эту проблему раньше, ноЯ не могу вспомнить, что я делал раньше.Любая помощь будет принята с благодарностью, поскольку дыра, которую я вставляю в стену, становится все больше и больше.

Ответы [ 3 ]

1 голос
/ 14 октября 2011

Есть пара вещей, которые вам, возможно, придется сделать (или проверить, если вы это сделали):

Ваш GetData OperationContract должен быть украшен атрибутом [WebGet].


    [WebGet]
    [OperationContract]
    object GetData(int value);

Ваш класс WebServiceWrapper должен быть украшен атрибутом [AspNetCompatibilityRequirements] (добавьте ссылку на System.ServiceModel.Web, чтобы это было доступно)


    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class WebServiceWrapper : IWebServiceWrapper

Возвращаемое значение из операции GetData необходимо будет перенести.Самый простой способ - использовать JavaScriptSerializer для сериализации объекта в json


    var serializer = new JavaScriptSerializer();
    return serializer.Serialize(new
                                {
                                    ReturnValue = string.Format("You entered: {0}", value)
                                });

. Необходимо убедиться, что вы используете [webHttpBinding] в своих конечных точках (клиент и службы)

<endpoint ... binding="webHttpBinding" ... />

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

<endpointBehaviors>
    <behavior name="[endpointBehaviorName]">
        <enableWebScript/>
    </behavior>
</endpointBehaviors>

Вам, очевидно, нужно будет обратиться к этой конфигурации поведения в вашей конечной точке (точках)

<endpoint ... behaviorConfiguration="[endpointBehaviorName]" ... />
0 голосов
/ 14 октября 2011

Вы, похоже, нарушаете такое же ограничение политики происхождения .Вы не можете отправлять междоменные запросы AJAX.Ваше приложение размещено на http://localhost:3000, и вы пытаетесь отправить запрос AJAX на http://localhost:55658.Это невозможно.Вы можете отправлять запросы AJAX только на http://localhost:3000.Вы можете использовать JSONP , чтобы обойти это ограничение.А вот другая статья на MSDN.

0 голосов
/ 14 октября 2011

Глядя на ваш запрос, вы делаете запрос OPTIONS, а не GET, что, я думаю, jQuery делает автоматически, если вы пытаетесь сделать межсайтовый XHR-запрос, см. Этот вопрос:

Почему я получаю запрос OPTIONS вместо запроса GET?

Я даже не уверен, что ваш сервер поддерживает метод OPTIONS, следовательно, ваша ошибка 400.

Даже разные номера портов считаются межсайтовыми запросами, поэтому вам лучше создать прокси-страницу на реальном веб-сайте, которая отправляет HTTP-запрос к вашей службе WCF.

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