通过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;
}
}
我一直在与之斗争,我看到其他人有同样类型的问题,我尝试了所有的建议,但仍然没有任何工作。
问题出在哪里?我该如何解决?
答案 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调用时遇到了这个问题,并得到了错误消息,该错误消息是该问题的标题,因此,我想列出解决该问题的必要步骤:>
Factory
中添加.svc
,也可以在web.config
中指定所需的内容。.html
文件,然后选择“在浏览器中查看”。您的默认浏览器将打开,如果使用的是Chrome,则该网址为localhost:51667/test.html
(实际上是http://localhost:51667/test.html
)。