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