如何使用jQuery或简单的js调用简单的WCF服务

时间:2010-07-19 10:11:06

标签: javascript jquery wcf

我有一个非常简单的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>

2 个答案:

答案 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> 

看看我们是否可以使你的配置形状相似,我们可以覆盖一些调整输入和输出格式的细节。