无法处理消息,因为内容类型'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;
}
}
我已经与之斗争了一段时间,我看到其他人也有同样的问题,我尝试了所有的建议,但仍然没有工作。
问题在哪里?我怎么解它?
我在这里猜测,因为您没有展示如何定义端点,但我很确定情况就是这样。您的端点不是为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
当我试图从Visual Studio在localhost上运行ajax调用时,我遇到了这个问题,并得到了错误消息,这是这个问题的标题,所以我想列出解决它所需的步骤:
- 如上所述,要么在
.svc
中添加Factory
,要么在web.config
中指定需要的内容。 在Visual Studio中,右键单击您的 - 你现在可以启动你的ajax调用,希望你能成功地得到你的web服务响应。 如果你想调试你的web服务,那么:
.html
文件,并选择"在浏览器中查看"。你的默认浏览器将打开,如果它是Chrome, url将是,例如,localhost:51667/test.html
(实际上是http://localhost:51667/test.html
)。在Visual Studio中,确保web服务的项目设置为Startup project,然后按F5。这将启动WCF测试客户端窗口,但您可以忽略它并触发您的ajax请求。
在我的例子中,问题是请求方法。我试图发送GET请求而不是POST请求。