无法处理该消息,因为内容类型“application/json; charset=utf-8”不是预期的类型“text/xml; charset=utf-8”。

18

当我通过ajax json调用WCF服务时,收到了上面的响应。我的调用代码是:

<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;
    }
}

我已经在和这个问题斗争了一段时间,我发现其他人也遇到了同样的问题,并尝试了所有他们提出的建议,但仍然没有解决。

问题出在哪里?我该如何解决它?


你好,你尝试了哪些建议? - Adam Gordon Bell
4个回答

22

我只能猜测你的终端点(endpoint)是如何定义的,因为你没有展示它的定义方式,但我很确定这是原因。你的终端点(endpoint)并没有被定义为 web 请求 - 很可能是使用了 basicHttpBinding。要通过 jQuery(或其他Web / REST客户端)来使用该终端点(endpoint),你需要使用WebHttpBinding来定义终端点,并对其应用WebHttpBehavior

有不同的方法可以正确定义终端点(endpoint)。最简单的方法是在 .svc 文件中使用WebServiceHostFactory

UserService.svc:

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

1

对于任何通过搜索而来的人:'content type 'application/json; charset=utf-8' was not the expected type 'text/xml; charset=utf-8'

在我的情况下,类似的错误是由于构建和运行服务时没有正确应用属性引起的。当我尝试更新客户端应用程序中的服务引用时,我收到了这个错误消息。当我正确地应用了'[DataContract]'和'[DataMember]'属性到我的自定义类时,问题得以解决。

编辑:如果你的服务已经设置好并且正常工作,然后在你编辑后出现了问题,那么这很可能适用。


2
请添加代码示例以进行详细说明。 - Ankit Tanna

1

这是一个相当老的问题,但我想在@carlosfigueira的回答上添加一些信息。

1. 在.svc中指定Factory与在web.config中指定<service>

.svc文件中指定Factory的另一种方法是在web.config文件中指定<service>。这在许多其他答案中已经解释过了(例如this one),因此我不会重复它们,但值得将另一个@carlosfigueira answer复制到这里:

如果在 .svc 文件中未指定任何工厂,则所有端点都将来自 web.config 文件 - WCF 将尝试查找与服务类的完全限定名称匹配的 元素的 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. 本地主机调用出现“无法处理消息”错误

当我尝试从Visual Studio在本地主机上运行ajax调用时,遇到了这个错误消息,因此我想列出解决它所需的步骤:

  1. 如上所述,要么在.svc中添加一个Factory,要么在web.config中指定需要的内容。
  2. 在Visual Studio中,右键单击您的.html文件,然后选择“在浏览器中查看”。将打开默认浏览器,如果是Chrome,则URL将是例如localhost:51667/test.html(实际上是http://localhost:51667/test.html)。
  3. 现在可以发出ajax请求,希望您成功获得您的Web服务响应。
  4. 如果您想调试您的Web服务,则:
    在Visual Studio中,确保Web服务项目已设置为启动项目,然后按F5。这将启动WCF测试客户端窗口,但您可以忽略它并发送您的ajax请求。

0
在我的情况下,问题是请求方法。我试图发送GET请求而不是POST请求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接