无法处理消息,因为内容类型为'application / json; charset = utf-8'不是预期的类型'text / xml;字符集= UTF-8'

时间:2013-01-18 16:42:05

标签: c# ajax wcf

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

我一直在与之斗争,我看到其他人有同样类型的问题,我尝试了所有的建议,但仍然没有任何工作。

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

3 个答案:

答案 0 :(得分:19)

我猜你在这里,因为你没有展示你如何定义你的端点,但我很确定是这样的。您的端点未定义用于Web使用 - 它可能使用basicHttpBinding。要通过jQuery(或其他一般的Web / REST客户端)使用端点,您需要使用WebHttpBinding定义端点,并将WebHttpBehavior应用于端点。

有正确定义端点的不同方法。最简单的方法是使用.svc文件中的WebServiceHostFactory

<强> UserService.svc

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

答案 1 :(得分:1)

对于任何通过搜索来到这里的人:'内容类型'应用程序/ json; charset = utf-8'不是预期的类型'text / xml;字符集= UTF-8'

在我的情况下,通过构建和运行没有适当属性的服务导致了类似的错误。当我尝试在客户端应用程序中更新服务引用时收到此错误消息。当我正确地将'[DataContract]'和'[DataMember]'属性应用于我的自定义类时,它已得到解决。

编辑:如果您的服务已经设置并正常运行,那么这很可能适用,然后在您编辑它之后就崩溃了。

答案 2 :(得分:0)

这是一个非常老的问题,但是我想在@carlosfigueira答案中添加一些信息。

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

Factory文件中指定.svc的替代方法是在<service>文件中指定web.config。这在其他许多答案中得到了解释(例如this one),所以我不再赘述,但是值得在这里复制另一个@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。在本地主机上调用时得到“无法处理消息...”

尝试从Visual Studio在本地主机上运行ajax调用时遇到了这个问题,并得到了错误消息,该错误消息是该问题的标题,因此,我想列出解决该问题的必要步骤:

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