我有一个需要通过SOAP(工作)和JSON(不工作)调用的WCF服务。
我的C#代码:
[ServiceContract]
public interface IService1
{
[OperationContract]
[WebGet(ResponseFormat=WebMessageFormat.Json)]
string Foo();
}
public class Service1 : IService1
{
public string Foo()
{
return "woohooo";
}
}
这是我的配置:
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<services>
<service name="Service1">
<endpoint address="soap" binding="basicHttpBinding" contract="DummyService.IService1"/>
<endpoint address="json" binding="webHttpBinding" behaviorConfiguration="jsonBehavior" contract="DummyService.IService1"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="jsonBehavior">
<enableWebScript/>
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
这是我的Javascript:
$.getJSON("/Service1.svc/Foo")
.success(function (result) {
alert("success! " + result);
})
.fail(function (result) {
console.log("failed!");
console.log(result);
});
我得到的回答是“400 Bad Request”。我究竟做错了什么?我遵循了REST / SOAP endpoints for a WCF service中的建议,但它仍然是没有工作的。 :-)帮助!
答案 0 :(得分:1)
我在想这是因为您使用的网址是绝对网址,而不是相对网址。
如果您在ASP.NET调试器中运行此服务,则该服务将在以下地址上提供:
http://localhost:52200/Web/Service1.svc
因为您在URL前面加了正斜杠,所以服务查询实际上是发送到
http://localhost:52200/Service1.svc
因此,您需要传递相应的相对地址。如果您的服务和脚本文件位于同一目录中,请将其更改为:
$.getJSON("./Service1.svc/Foo")
答案 1 :(得分:1)
尝试在服务URL中包含端点地址。类似的东西:
$.getJSON("/Service1.svc/json/Foo")
此外,您应该启用WCF tracing以查看返回的错误。您需要Service Trace Viewer才能查看日志信息。
<强>更新强>
以下是使用您的代码的示例。
配置文件包含
<system.serviceModel>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
<services>
<service behaviorConfiguration="jsonServiceBehavior" name="DummyService.Service1">
<endpoint address="soap" binding="basicHttpBinding" contract="DummyService.IService1"/>
<endpoint address="json"
behaviorConfiguration="jsonBehavior"
binding="webHttpBinding" contract="DummyService.IService1"/>
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="jsonBehavior">
<webHttp/>
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="jsonServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
我创建了一个空的Web项目并添加了以下HTML页面来测试该服务。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script src="Scripts/jquery-1.6.4.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function () {
$.getJSON("/Service1.svc/json/Foo")
.success(function (result) {
alert("success! " + result);
})
.fail(function (result) {
console.log("failed!");
console.log(result);
});
});
</script>
</head>
<body>
</body>
</html>
我的Service1.svc
有以下内容:
<%@ ServiceHost Language="C#" Service="DummyService.Service1" %>
答案 2 :(得分:1)
尝试从端点行为中取出<webHttp />
元素。
我有一个由Ajax调用的Web服务,它没有这个元素。
当我尝试放入元素时,它停止工作。
(不可否认,这与未识别日期格式有关,因此它与您的问题不完全匹配。)
答案 3 :(得分:1)
(我的第三个答案。我知道其中一个答案是正确的: - )
尝试在serviceHostingEnvironment上将aspNetCompatibilityEnabled
设置为true。
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
这只是猜测。当我关闭我的实现时,调用仍然到达,但HttpContext.Current
返回NULL。