0

我有一个 WCF 服务,它具有三个具有不同绑定的端点(soap 客户端的 basicHttpBinding、jquery ajax 客户端的 webHttpBinding 和 mex)。

我可以通过 SOAP 访问服务(然后通过添加服务引用):

        ServiceRef.IService service = new ServiceClient("BasicHttpBinding_IService");
        Response.Write(service.TestMethod("hi"));

但是为什么我从 Jquery Ajax 调用我得到一个 404 错误。

如果我将服务复制到一个测试项目中并只定义一个 webHttpBinding,我可以通过 jquery 调用该服务。

IService.cs

   [ServiceContract]
    public interface IService
    {
        [OperationContract]
        [WebInvoke(Method = "POST",
         ResponseFormat = WebMessageFormat.Json)]
         Response TestMethod(string Id);
....

服务.cs

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior]
public class Service : IService
{
    [OperationBehavior]
    public Response TestMethod(string Id)
    {
        Response resp = new Response();
        resp.Message = "hello";
        return resp;
    }
....

网络配置

  <system.serviceModel>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="false" aspNetCompatibilityEnabled="true" />
<services>
  <service
   name="eBooks.Presentation.Wcf.Service"
   behaviorConfiguration="eBooks.Presentation.Wcf.ServiceBehavior">
    <!-- use base address provided by host -->
    <!-- specify BasicHttp binding and a binding configuration to use -->
    <endpoint address="soap"
              binding="basicHttpBinding"
              bindingConfiguration="Binding1"
              contract="eBooks.Presentation.Wcf.IService" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      <endpoint address="" binding="webHttpBinding"
          contract="eBooks.Presentation.Wcf.IService" behaviorConfiguration="EndpBehavior"/>
  </service>
</services>
<bindings>
  <!-- 
      Following is the expanded configuration section for a BasicHttpBinding.
      Each property is configured with the default value.
      See the TransportSecurity, and MessageSecurity samples in the
      Basic directory to learn how to configure these features.
      -->
  <basicHttpBinding>
    <binding name="Binding1"
             hostNameComparisonMode="StrongWildcard"
             receiveTimeout="00:10:00"
             sendTimeout="00:10:00"
             openTimeout="00:10:00"
             closeTimeout="00:10:00"
             maxReceivedMessageSize="65536"
             maxBufferSize="65536"
             maxBufferPoolSize="524288"
             transferMode="Buffered"
             messageEncoding="Text"
             textEncoding="utf-8"
             bypassProxyOnLocal="false"
             useDefaultWebProxy="true" >
      <security mode="None" />
    </binding>
  </basicHttpBinding>
</bindings>
<behaviors>
  <serviceBehaviors>
    <behavior name="eBooks.Presentation.Wcf.ServiceBehavior">
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
      <serviceMetadata httpGetEnabled="true"/>
      <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="EndpBehavior">
      <webHttp/>
    </behavior>
  </endpointBehaviors>
</behaviors>

jQuery

    function CallService() {
        $.ajax({
            type: "POST", //GET or POST or PUT or DELETE verb
            url: "http://localhost:888/Service.svc/TestMethod", // Location of the service
            data: '{"Id": "1"}', //Data sent to server
            contentType: "application/json; charset=utf-8", // content type sent to server
            dataType: "json", //Expected data format from server
            processdata: ProcessData, //True or False
            success: function (msg) {//On Successfull service call
                ServiceSucceeded(msg);
            },
            error: ServiceFailed// When Service call fails
        });
    }

在我的端点配置中,我将 webHttp 端点的地址设置为“”,因为我不知道从 jquery 调用时如何选择特定端点。

有人知道为什么我会收到此 404 错误吗?

4

1 回答 1

0

1) 确保您的 Service.svc 位于根目录中。

2) 添加

[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json)]

到你实例化你的 TestMethod 的地方。像这样:

[OperationBehavior]
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json)]
public Response TestMethod(string Id)
{
    Response resp = new Response();
    resp.Message = "hello";
    return resp;
}

这些都有帮助吗?

于 2013-08-22T20:16:09.903 回答