0

我有一个简单的 WCF 服务,其接口如下:

[ServiceContract]
public interface IPageService {

    [OperationContract]
    [WebGet(UriTemplate = "/GetPage/{pageNumber}", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
    Page GetPage(string pageNumber);

    [OperationContract]
    [WebInvoke(UriTemplate = "/SetPages", Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
    string SetPages(Page[] pages);
}

配置文件的 system.serviceModel 部分如下:

<system.serviceModel>
  <protocolMapping>
    <add scheme="http" binding="webHttpBinding"/>
  </protocolMapping>
  <behaviors>
    <serviceBehaviors>
      <behavior>
        <serviceMetadata httpGetEnabled="true"/>
        <serviceDebug includeExceptionDetailInFaults="true"/>
      </behavior>
    </serviceBehaviors>
    <endpointBehaviors>
      <behavior>
        <webHttp/>
      </behavior>
    </endpointBehaviors>
  </behaviors>
  <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>

使用以下 JavaScript 调用 GetPage 方法有效:

$.ajax({
    cache: false,
    url: 'http://localhost/Test/PageService.svc/GetPage/1', 
    type: 'GET',
    success: function(result) {
        // do success stuff 
    }, 
    error: function(req, status, error) { 
        // do error stuff
    } 
});

使用以下 JavaScript 调用 SetPages 方法会返回 404 错误:

$.ajax({
    cache: false,
    url: 'http://localhost/Test/PageService.svc/SavePages', 
    type: 'POST',
    data: '[{...}]', 
    dateType: 'json',
    contentType: 'application/json',
    processData: false,
    success: function(result) { 
        // do success stuff 
    }, 
    error: function(req, status, error) { 
        // do error stuff 
    } 
});

我已经尝试了 ajax 调用中的几乎所有参数组合,但没有任何区别。我玩过配置文件并尝试了此处和各种博客中建议的各种配置,但所做的只是使这两种方法都返回 AddressFilter 或 ContractFilter 不匹配。我错过了什么?使这两种方法都起作用的最快/最简单的方法是什么?

4

1 回答 1

2

根据您发布的代码,jscript 调用 SavePages 方法,但在服务器端,post 方法的名称为 SetPages。

于 2012-11-24T19:33:32.143 回答