繁体   English   中英

400错误的请求JQuery WCF服务

[英]400 Bad Request JQuery WCF Service

我在VS2012的ASP.NET 4.5中创建了WCF Web服务,该服务返回JSON响应。 该服务可以与内置的Web服务客户端正常工作,并且在Web.config文件中正确设置了端点。

在客户端,我在Jquery中有一个简单的测试脚本,但是运行该脚本后,会收到一个HTTP / 1.1 400 Bad Request。

Web服务根本不需要任何输入-因此data:设置为空字符串。

这是调用服务时得到的信息(在FireFox中使用HTTP Live Headers插件)。

http://localhost:58234/CCSVC.svc/Get_BTCE_BTC_USD

OPTIONS /CCSVC.svc/Get_BTCE_BTC_USD HTTP/1.1
Host: localhost:58234
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Origin: http://localhost:59099
Access-Control-Request-Method: GET
Access-Control-Request-Headers: content-type
Connection: keep-alive

HTTP/1.1 400 Bad Request
Cache-Control: private
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?RTpcc2l0ZXMyXENyeXB0b0NvaW5TZXJ2aWNlc1xDQ1NWQy5zdmNcR2V0X0JUQ0VfQlRDX1VTRA==?=
X-Powered-By: ASP.NET
Date: Mon, 23 Dec 2013 16:08:27 GMT
Content-Length: 0

和脚本:

$(document).ready(function () {


    $('#btnRefresh').click(function () {

       $.ajax({
            type: 'GET',
            url: 'http://localhost:58234/CCSVC.svc/Get_BTCE_BTC_USD',
            data: '',
            contentType: 'application/json',
            dataType: 'json',
            processData: true,
            crossDomain: true,
            success: function (msg) {
                ServiceSucceeded(msg);
            },
            error: function (msg) {
                ServiceFailed(msg);
            }
        });


        function ServiceSucceeded(result) {
            alert("success");
        };

        function ServiceFailed(result) {
            alert("fail");
        };


    });




});

自然,它失败了。 我尝试了几种不同的组合,没有运气和POST,还有GET。 crossDomain是/否,processData是/否等。似乎没有任何作用。

这是Web服务的合同:

<OperationContract()>
<WebInvoke(BodyStyle:=WebMessageBodyStyle.Bare, RequestFormat:=WebMessageFormat.Json, ResponseFormat:=WebMessageFormat.Json)>
Function Get_BTCE_BTC_USD() As TradeData

这似乎是请求的问题,但该错误并未表明可能是什么。

这是WCF服务中web.config的内部:

  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
      <section name="CryptoCoinServices.My.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup>
  </configSections>
  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" strict="false" explicit="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="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="false"/>
        </behavior>
        <behavior name="metadataBehavior">
          <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="metadataBehavior" name="CryptoCoinServices.Service1">
        <!-- leave address empty for localhost -->
        <endpoint
            address="" 
            binding="basicHttpBinding"
            contract="CryptoCoinServices.IService1"
           />
        <endpoint
          address="mex"
          binding="mexHttpBinding"
          contract="IMetadataExchange" />
      </service>
    </services>
    <protocolMapping>
      <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </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>

建议您在jQuery脚本中进行以下更改(仍然无效,但数据的{}显然是强制性的):

   $.ajax({
        type: 'POST',
        url: 'http://localhost:58234/CCSVC.svc/Get_BTCE_BTC_USD',
        data: '{}',
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        processData: true,
        crossDomain: true,
        success: function (msg) {
            ServiceSucceeded(msg);
        },
        error: function (msg) {
            ServiceFailed(msg);
        }
    });

更改为webHttpBinding之后的新错误:

http://localhost:58234/CCSVC.svc/Get_BTCE_BTC_USD

OPTIONS /CCSVC.svc/Get_BTCE_BTC_USD HTTP/1.1
Host: localhost:58234
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Origin: http://localhost:59099
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

HTTP/1.1 500 Internal Server Error
Cache-Control: private
Content-Length: 513
Content-Type: application/xml; charset=utf-8
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?RTpcc2l0ZXMyXENyeXB0b0NvaW5TZXJ2aWNlc1xDQ1NWQy5zdmNcR2V0X0JUQ0VfQlRDX1VTRA==?=
X-Powered-By: ASP.NET
Date: Mon, 23 Dec 2013 17:02:44 GMT

由于您正在进行跨域通信,因此默认情况下WCF不支持跨域通信。请查看以下链接以获取完整示例

使用Jquery调用跨域WCF服务

我创建了一个示例WCF,它可以与您说明的方案一起使用。 但是代码在c#中。 您可以尝试以下配置和代码。

  namespace WCF
{
    [ServiceContract(Namespace = "Testing")]
    //[ServiceContract]
    public interface ITestWCF
    {
        [OperationContract]
        [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
        String HelloWorld();

    }
}



namespace WCF
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService2" in both code and config file together.
    class TestWCF : ITestWCF
    {
        public string HelloWorld()
        {

            return "Hello!!!";
        }

    }
}

Ajax呼叫:

$.ajax({
            url: "Service1.svc/rest/HelloWorld?",
            type: "POST",
            data: "{}",       
            success: fnsuccesscallback,
            contentType: "application/json; charset=utf-8",
            error: fnerrorcallback,
            dataType: "json"
        });

Web.config文件:

<system.serviceModel>   
<client />
<bindings>
  <basicHttpBinding>
    <binding name="BasicHttpEndpointBinding">
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="None" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
<services>        
  <service name="WCF.TestWCF" behaviorConfiguration="TestWCFBehaviour">
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:1991/Service1.svc"/>
      </baseAddresses>
    </host>
    <endpoint address="rest" binding="webHttpBinding" contract="WCF.ITestWCF" behaviorConfiguration="TestWCFEndPointBehaviour" name="httpEndpoint"></endpoint>
    <endpoint address="soap" binding="basicHttpBinding" contract="WCF.ITestWCF" bindingConfiguration="BasicHttpEndpointBinding"/>
    <endpoint address="mex"  binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="TestWCFBehaviour">
      <serviceMetadata httpGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="false"/>
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="TestWCFEndPointBehaviour">
      <!--<enableWebScript/>-->
      <webHttp/>
    </behavior>
  </endpointBehaviors>
</behaviors>

请注意,我已经使用webHttpBinding公开了一个端点,并且将其命名为rest

您也可以参考http://www.wcf.dotnetarchives.com/2013/12/invoking-restful-wcf-service-with_20.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM