![](/img/trans.png)
[英]HTTP 415 Cannot process the message because the content type 'application/json; charset=utf-8' was not the expected type 'text/xml; charset=utf-8'
[英]Cannot process the message because the content type 'application/json; charset=utf-8' was not the expected type 'text/xml; charset=utf-8'
通过 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;
}
}
我一直在与之斗争一段时间,我看到其他人也遇到过同样类型的问题,我尝试了所有的建议,但仍然没有任何效果。
问题出在哪里? 我该如何解决?
我猜这里是因为你没有展示你是如何定义你的端点的,但我很确定是这样的。 您的端点不是为网络消费定义的 - 它可能使用basicHttpBinding
。 要通过 jQuery(或一般的其他 web/REST 客户端)使用端点,您需要使用WebHttpBinding
定义一个端点,并将WebHttpBehavior
应用于它。
有多种方法可以正确定义端点。 最简单的方法是在 .svc 文件中使用WebServiceHostFactory
:
用户服务.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 文件中指定任何工厂,则所有端点都将来自 web.config 文件 - 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 上调用时出现“无法处理消息...”
当我尝试从 Visual Studio 在 localhost 上运行 ajax 调用时,我遇到了这个问题,并得到了这个问题的标题错误消息,所以我想列出解决它所需的步骤:
.svc
中添加Factory
,要么在web.config
中指定需要的内容。.html
文件,然后选择“在浏览器中查看”。 您的默认浏览器将打开,如果是 Chrome,则 URL 将是,例如localhost:51667/test.html
(实际上是http://localhost:51667/test.html
)。就我而言,问题是请求方法。 我试图发送 GET 请求而不是 POST 请求。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.