Ajax POST 调用不适用于 WCF

Posted

技术标签:

【中文标题】Ajax POST 调用不适用于 WCF【英文标题】:Ajax POST call won't working with WCF 【发布时间】:2016-06-07 06:37:57 【问题描述】:

我正在尝试通过 Ajax POST 调用向 WCF 服务发送数据 我用 jSON 发送数据

当我尝试拨打电话时,WCF 服务无法获取发送的数据 调试显示我的输入参数等于null

这是我的源代码: jQuery 端

$.ajax
    (
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        url: "http://192.168.0.12:25460/Service1.svc/getPost",
        type: 'POST',
        data: "value": "test",
        timeout: 5000,
        success: function (data, status, xhr)
        
            alert('Success: '+data);
        ,
        error: function(x, e)
        
            alert(x.status + " " + x.responseText);
        
    );

WCF 端

Iservice1.cs

[ServiceContract]
public interface IService1

    [OperationContract]
    [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle=WebMessageBodyStyle.Wrapped, RequestFormat = WebMessageFormat.Json, UriTemplate = "/getPost?value=value")]
    string getPost(string value);

    [OperationContract]
    CompositeType GetDataUsingDataContract(CompositeType composite);


Service1.svc

public class Service1 : IService1

    public string getPost(string value)
    
        return "Reçu :" + value;
    

Web.config

    <?xml version="1.0" encoding="utf-8"?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" maxUrlLength="500"/>
  </system.web>
  <system.serviceModel>
    <services>
        <service name="WcfService1.Service1">
            <!-- Service Endpoints -->
            <endpoint address="" binding="webHttpBinding" contract="WcfService1.IService1" behaviorConfiguration="webBehavior">
            </endpoint>
        </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="webBehavior">
          <webHttp />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior>
          <!-- Pour éviter la divulgation d'informations de métadonnées, définissez les valeurs ci-dessous sur false avant le déploiement -->
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <!-- Pour recevoir les détails de l'exception dans les erreurs à des fins de débogage, définissez la valeur ci-dessous sur true. Pour éviter la divulgation d'informations d'exception, définissez-la sur false avant le déploiement -->
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
        <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <!--
        Pour parcourir le répertoire racine de l'application Web lors du débogage, définissez la valeur ci-dessous sur true.
        Définissez-la sur false avant le déploiement pour ne pas divulguer d'informations du dossier de l'application Web.
      -->
    <directoryBrowse enabled="true"/>
  </system.webServer>

</configuration>

感谢您的帮助!

【问题讨论】:

这对我来说看起来很可疑/getPost?value=value 这样的东西将用于 GET 而不是 POST。除掉 ?以及之后的一切。 【参考方案1】:

尝试以下更改。愿它行得通..

jQuery 端

$.ajax
    (
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        url: "http://192.168.0.12:25460/Service1.svc/getPost/test",//value in url..
        type: 'POST',
      //  data: "value": "test", remove this line.
        timeout: 5000,
        success: function (data, status, xhr)
        
            alert('Success: '+data);
        ,
        error: function(x, e)
        
            alert(x.status + " " + x.responseText);
        
    );

WCF 端

Iservice1.cs

[ServiceContract]
public interface IService1

    [OperationContract]
    [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle=WebMessageBodyStyle.Wrapped, RequestFormat = WebMessageFormat.Json, UriTemplate = "/getPost/value")]//change here 
    string getPost(string value);

    [OperationContract]
    CompositeType GetDataUsingDataContract(CompositeType composite);

我只是改变了你的参数发送方式,并把它放在 URL 中。

【讨论】:

以上是关于Ajax POST 调用不适用于 WCF的主要内容,如果未能解决你的问题,请参考以下文章

wordpress 中的 Ajax 调用不适用于前端站点的订阅者用户

使用 POST 方法从 jQuery Ajax 调用 WCF 服务

ASP.NET C# SuppressFormsAuthenticationRedirect 不适用于 Ajax POST?

带有 WCF 调用的 Ajax 返回 404 错误

使用 jQuery ajax 调用 WCF 服务

用于下载文件的php代码不适用于ajax [重复]