我有一个非常简单的hello world WCF服务,如下所示。当我通过添加Web服务引用通过asp.net项目调用它时,它工作得很好。但是当我使用jQuery或标准js ajax调用(使用XMLHttpRequest
)调用它时,它会调用success函数但返回null数据。
当我尝试使用以下地址通过firefox浏览器访问它时:http://localhost:8282/Test/TestService.svc/HelloWorld
它返回错误代码“a:ActionNotSupported”,错误详细信息为
由于EndpointDispatcher上的ContractFilter不匹配,无法在接收方处理带有Action''的消息。这可能是由于合同不匹配(发送方与接收方之间的操作不匹配)或发送方与接收方之间的绑定/安全性不匹配。检查发件人和收件人是否具有相同的合同和相同的约束(包括安全要求,例如邮件,传输,无)。
如果我将绑定更改为wsHttpBinding
,则即使在Firefox中也不会返回任何内容。
以下是代码:
文件“Test / ITestService.svc”:
[ServiceContract(Namespace = "http://localhost:8282/")]
public interface ITestService
{
[OperationContract]
string HelloWorld();
}
文件“Test / TestService.svc”:
public class TestService : ITestService
{
public string HelloWorld()
{
return "This is echo from server. Hello World";
}
}
文件“web.config”
<system.serviceModel>
<services>
<service name="radMLRPC.Test.TestService" behaviorConfiguration="radMLRPC.Test.TestServiceBehavior"
<endpoint address="HelloWorld" binding="webHttpBinding" contract="radMLRPC.Test.ITestService">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="radMLRPC.Test.TestServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
答案 0 :(得分:5)
使用上面的代码服务只允许soap请求,以便允许获取http请求,我们必须修改代码,如下所示:
[WebGet(UriTemplate="helloworld")]
[OperationContract]
string HelloWorld();
web配置中的添加behaviorConfiguration:
<endpoint address="" binding="webHttpBinding" contract="radMLRPC.Test.ITestService" behaviorConfiguration="webBehav">
然后在行为中添加以下标记:
&LT; endpointBehaviors&gt; &LT; behavior name =“webBehav”&gt; 的&LT; webHttp /&gt; &LT; / behavior&gt; &LT; / endpointBehaviors&gt;
“请从上方删除多余的空格。它没有显示没有额外空格的标签”
查看一些资源:
使用WCF的RESTful服务简介 http://msdn.microsoft.com/en-us/magazine/dd315413.aspx
Endpoint.TV截屏视频:
Endpoint.TV一般对WCF和WCF REST的内容有很好的报道。 http://channel9.msdn.com/shows/Endpoint /
答案 1 :(得分:1)
Consuming ASP.net WebServices, WCF Services and static Page methods from JavaScript (sans MS AJAX)
对于webHttp和客户端脚本,mex绑定没有用。现在放弃它。
身份可能会让你感到悲伤,暂时放下它。
您有HelloWorld作为您的地址,为了在您的服务上调用HelloWorld方法,您需要调用http://localhost:8282/Test/TestService.svc/HelloWorld/HelloWorld。放下它。
<services>
<service name="radMLRPC.Test.TestService" behaviorConfiguration="radMLRPC.Test.TestServiceBehavior"
<endpoint address="" binding="webHttpBinding" contract="radMLRPC.Test.ITestService"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="radMLRPC.Test.TestServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
现在可能不能让你一直到那里,但会给我们一个更好的起点。我愿意帮你解决这个问题。
将我们现有的内容与链接文章
中显示的工作示例进行比较<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="AjaxEndpointBehavior">
<enableWebScript />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="ClientScriptServices.Service1Behavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="ClientScriptServices.Service1Behavior" name="ClientScriptServices.Service1">
<endpoint behaviorConfiguration="AjaxEndpointBehavior" binding="webHttpBinding" contract="ClientScriptServices.Service1" />
</service>
</services>
</system.serviceModel>
看看我们是否可以使你的配置形状相似,我们可以覆盖一些调整输入和输出格式的细节。