WCF和Ajax。不允许的方法让我发疯

时间:2012-11-20 10:00:41

标签: c# jquery ajax wcf web-config

我正在将ajax连接到wcf服务。但不要让方法得到。已经调试好几天了。我得不到它。 我只是测试默认的GetData(int值)方法。

的Ajax:

    <script type="text/javascript" src="jquery-1.7.2.min.js"></script>
<script type="text/javascript">
   $.ajax({
            type: "POST",
            url: "http://localhost:19478/Service1.svc/GetData",
            data: JSON.stringify({"value": "test"}),
            contentType: "application/json; charset=utf-8",
            dataType: "jsonp",
             success: function (msg) {
                        alert(msg);
                    },
         error: function (msg) {
                        alert("Failed");
                    }
        });

        function OnSuccessCall(response) {
            alert(response);
        }


        function OnErrorCall(response) {
            alert(response.status + " " + response.statusText);
        }

        </script>

的web.config:

<?xml version="1.0"?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <system.serviceModel>





    <services>
      <service name="WcfServiceTest.Service1" behaviorConfiguration="myServiceBehavior">
        <endpoint name="webHttpBinding"
                  address="" binding="webHttpBinding"
                  contract="WcfServiceTest.IService1"
                  behaviorConfiguration="webHttp"
                  >
        </endpoint>
        <endpoint name="mexHttpBinding"
                  address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange"
                  />
      </service>
    </services>






    <behaviors>

      <serviceBehaviors>
        <behavior name="myServiceBehavior" >
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
        <behavior>

          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>

          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>


      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="webHttp">
          <webHttp/>
        </behavior>

        <behavior name="NewBehavior0">
          <webHttp helpEnabled="true"/>

        </behavior>
      </endpointBehaviors>

    </behaviors>
    <protocolMapping>
        <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="false" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <!--
        To browse web app root directory during debugging, set the value below to true.
        Set to false before deployment to avoid disclosing web app folder information.
      -->
    <directoryBrowse enabled="true"/>
  </system.webServer>

</configuration>

Iservice1:

 [OperationContract]
        [WebInvoke(Method="POST",
        RequestFormat=WebMessageFormat.Json,
        ResponseFormat=WebMessageFormat.Json)]
        string GetData(String value);

服务1:

public string GetData(String value)
        {
            return string.Format("You entered: {0}", value);
        }

public class Service1 : IService1以上没有任何内容。 [ServiceContract]以上public interface IService1

我添加了很多东西,删除了很多东西..我不知道了。 我怀疑它是我的web.config文件,我没有得到那个部分

2 个答案:

答案 0 :(得分:3)

您的操作合同表明它是一种发布方法,但您要求JSONP仅支持Get次请求。如果它不是跨域请求,则不需要使用JSONP,只需将方法设置为Post作为您的请求,并删除类型,您的响应格式也不是JSON对象也会更改它,因此您需要通过更改合同或更改方法中的返回数据,然后它应该工作。

编辑提交:

首先,JSONP不是实际的xmlhttprequest对象请求。它正在做的是为您的页面添加一个脚本标记,该标记具有您的回调函数,请求数据作为参数。它主要针对跨域数据共享。 JSONP请求返回类似下面的内容

请求网址:domain.com/getJsonp?callback=processJSONP

返回;

processJSONP( {
   resultList: [{data: "hello"}, 
                {data: "world"}
   // and lost of data you need.
   ]
});

注意processJSONP这是你的页面或库中的功能,并做你想做的事。

function processJSONP(jsonpResult) {
   for(var key in jsonpResult.resultList)
   {
      //process the data
   }
}

如果您肯定需要使用POST获取数据,则它不能是JSONP。它必须是一个AJAX请求,并且也在同一个域中。在这种情况下,您可以在AJAX请求的成功函数中处理数据。

答案 1 :(得分:0)

好的,2天后,我已经修好了。

这是我的步骤,感谢所有贡献的人。

  1. 在我的IService界面中,我将其添加到我的webinvoke:

    BodyStyle = WebMessageBodyStyle.WrappedRequest

  2. 将数据类型从jsonp更改为json,jsonp仅支持GET(感谢Onur TOPAL)。

  3. 将我的ajax / json文件放在我的visual studio项目文件夹中。这将使它在IIS服务器上运行。