Не удается обработать сообщение, потому что тип контента "application/json; charset = utf-8 'не был ожидаемым типом text/xml; кодировка = UTF-8'

Я получаю вышеупомянутый ответ при вызове службы WCF через ajax json. Мой код вызова:

<script type="text/javascript">
    $(document).ready(function () {
        $.ajax
        ({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            url: "http://localhost:90/WebServices/UserService.svc/Calculate",
            data: "{}",
            timeout: 10000,
            dataType: "json",
            success: function (response) {
                alert(response)
            },
            error: function (xhr, ajaxOptions, thrownError) {
                alert(xhr.statusText);
                alert(thrownError);
            }
        });
    });
</script>

Мой сервис:

[ServiceContract]
public interface IUserService
{
    [OperationContract]
    [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json
     )]
    Answer Calculate();
}

[DataContract]
public class Answer
{
    [DataMember]
    public string answer { get; set; }
}

Мой метод:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class UserService : IUserService
{
    public Answer Calculate()
    {
        Answer answer = new Answer();
        answer.answer="Hello World";
        return answer;
    }
}

Я когда-то сражался, я вижу, что у других людей была проблема с тем же типом, и я пробовал все предложения, но ничего не работает.

Где проблема? Как я могу его решить?

Ответы

Ответ 1

Я предполагаю, что здесь вы не указали, как вы определили свою конечную точку, но я уверен, что это так. Конечная точка не определена для использования в сети - она, вероятно, использует basicHttpBinding. Чтобы потреблять конечную точку через jQuery (или другие клиенты Web/REST в целом), вам необходимо определить конечную точку с помощью WebHttpBinding и применить к ней WebHttpBehavior.

Существуют различные способы правильного определения конечной точки. Самый простой способ - использовать WebServiceHostFactory в вашем файле .svc:

UserService.svc

<%@ ServiceHost Language="C#" Debug="true" Service="YourNamespace.UserService"
                Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>

Ответ 2

Для тех, кто приземляется здесь, ища: приложение типа контента /json; charset = utf-8 'не был ожидаемым типом text/xml; кодировка = UTF-8'

Подобная ошибка была вызвана в моем случае созданием и запуском службы без надлежащих атрибутов. Я получил это сообщение об ошибке, когда попытался обновить служебную ссылку в своем клиентском приложении. Это было разрешено, когда я правильно применил атрибуты "DataContract" и "[DataMember]" к моим пользовательским классам.

Изменить: это, скорее всего, применимо, если ваша служба была настроена и работает, а затем она сломалась после того, как вы ее отредактировали.

Ответ 3

Это довольно старый вопрос, но я хотел бы добавить некоторую информацию к ответу @carlosfigueira.

1. Указание Factory в .svc против указания <service> в web.config

Альтернативой указанию Factory в файле .svc является указание <service> в файле web.config. Это объясняется во многих других ответах (например, этот), поэтому я не буду повторять их, но здесь стоит скопировать еще один ответ @carlosfigueira answer:

Если вы не укажете фабрику в файле .svc, все конечные точки придет из файла web.config - WCF попытается найти Элемент <system.serviceModel / service>, чей атрибут name совпадает полное имя класса обслуживания. Если он не находит, затем он добавит конечную точку по умолчанию (используя basicHttpBinding, если только вы изменили отображение по умолчанию).

И чтобы быть ясным: полное имя должно включать пространство имен. Так что если у вас есть следующее, это будет MyWebServices.ExampleWebService:

namespace MyWebServices
{
    [ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
    public class ExampleWebService
    {
        [OperationContract]
        [WebInvoke(Method = "POST",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json)]
        public string DoWork(DoWorkRequest request)
        {
            return "success!";
        }
    }
}


2. Получение сообщения "Не удается обработать сообщение..." при вызове на локальном хосте

Я пришел к этому вопросу, пытаясь запустить вызов ajax на localhost из Visual Studio, и получил сообщение об ошибке, которое является заголовком этого вопроса, поэтому я хотел бы перечислить необходимые шаги для его решения:

  1. Как объяснено выше, либо добавьте Factory в .svc, либо укажите, что нужно в web.config.
  2. В Visual Studio щелкните правой кнопкой мыши файл .html и выберите "Просмотр в браузере". Ваш браузер по умолчанию откроется, и если это Chrome, URL будет, например, localhost:51667/test.html (который на самом деле http://localhost:51667/test.html).
  3. Теперь вы можете выполнить вызов AJAX и, надеюсь, вы получите ответ от веб-службы.
  4. Если вы хотите отладить свой веб-сервис, то:
    В Visual Studio убедитесь, что проект веб-службы установлен в качестве проекта запуска, и нажмите F5. Это приведет к запуску окна тестового клиента WCF, но вы можете просто проигнорировать его и запустить запрос ajax.