Метод OPTIONS отклонен при использовании междоменной службы WCF - PullRequest
2 голосов
/ 20 декабря 2011

Я пытаюсь выполнить POST для службы WCF. При использовании Firefox 8 браузер сначала отправляет HTTP-запрос OPTIONS.

Это прекрасно работает, когда я использую WebMessageBodyStyle.Bare в качестве BodyStyle, но я хочу использовать стиль тела Wrapped. Когда я переключаюсь на Wrapped, запрос OPTIONS отклоняется со статусом 400. Я подозреваю, что это связано с тем, что запрос OPTIONS не имеет тела, следовательно, анализатор BodyStyle завершается ошибкой.

Вот схема моего веб-метода:

[OperationContract(ProtectionLevel = ProtectionLevel.None)]
[WebInvoke(Method = "*",
           BodyStyle = WebMessageBodyStyle.Wrapped,
           RequestFormat = WebMessageFormat.Json,
           ResponseFormat = WebMessageFormat.Json)]
bool Ping(String msg);

И я использую следующий jquery для вызова:

$.ajax({
            url: "http://localhost/Server/Service.svc/Ping",
            data: JSON.stringify({msg: msg}),
            type: "POST",
            processData: false,
            contentType: "application/json",
            timeout: 10000,
            dataType: "text"
});

Буду признателен за любую помощь в этом вопросе ... Спасибо !!

1 Ответ

2 голосов
/ 09 января 2012

Я решил эту проблему, добавив пользовательский IErrorHandler к поведению Enpoint. Общие инструкции о том, как это сделать, здесь .

public bool HandleError(Exception error)
{
  if (error.Message.Contains("IsEmpty = true")) return true;

  return false;
}

и

public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
        {
            if (error.Message.Contains("IsEmpty = true"))
            {
                fault = Message.CreateMessage(version, "");
                var jsonFormatting = new WebBodyFormatMessageProperty(WebContentFormat.Json);
                fault.Properties.Add(WebBodyFormatMessageProperty.Name, jsonFormatting);
                var httpResponse = new HttpResponseMessageProperty
                                       {
                    StatusCode = System.Net.HttpStatusCode.OK,
                    StatusDescription = "OK"
                };
                fault.Properties.Add(HttpResponseMessageProperty.Name, httpResponse);
            }
            else
            {
                fault = GetJsonFaultMessage(version, error);

                var jsonFormatting = new WebBodyFormatMessageProperty(WebContentFormat.Json);
                fault.Properties.Add(WebBodyFormatMessageProperty.Name, jsonFormatting);
                var httpResponse = new HttpResponseMessageProperty
                                       {
                    StatusCode = System.Net.HttpStatusCode.BadRequest,
                    StatusDescription = "Bad Request"
                };
                fault.Properties.Add(HttpResponseMessageProperty.Name, httpResponse);
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...