无法处理消息,因为内容类型'application/json;charset = utf - 8 # 39;不是

本文关键字:charset json utf 不是 application 因为 消息 处理 类型 | 更新日期: 2023-09-27 17:54:45

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

我已经与之斗争了一段时间,我看到其他人也有同样的问题,我尝试了所有的建议,但仍然没有工作。

问题在哪里?我怎么解它?

无法处理消息,因为内容类型'application/json;charset = utf - 8 # 39;不是

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

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

UserService.svc :

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

任何人登陆这里通过搜索:'content type 'application/json;Charset =utf-8'不是预期的类型'text/xml;utf - 8字符集= '

在我的例子中,由于构建和运行一个没有适当属性的服务,导致了类似的错误。当我试图更新客户端应用程序中的服务引用时,我收到了此错误消息。当我正确地应用'[DataContract]'和'[DataMember]'属性到我的自定义类时,它已经解决了。

编辑:这很可能适用于如果你的服务已经设置好并工作,然后在你编辑它之后它就坏了。

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

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

.svc文件中指定Factory的替代方法是在web.config文件中指定<service>。这在许多其他答案中都有解释(例如这个),所以我不会重复它们,但值得在这里复制另一个@carlosfigueira的答案:

如果你没有在.svc文件中指定任何工厂,所有的端点将来自网络。配置文件- WCF将尝试找到一个name属性匹配的<system.serviceModel / service>元素服务类的全限定名。如果找不到,然后它将添加一个默认端点(使用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。在localhost

上调用时获取"Cannot process message…"

当我试图从Visual Studio在localhost上运行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服务的项目设置为Startup project,然后按F5。这将启动WCF测试客户端窗口,但您可以忽略它并触发您的ajax请求。

在我的例子中,问题是请求方法。我试图发送GET请求而不是POST请求。