2012-02-14 24 views
0

WebアプリケーションにWCFサービスがあり、別のWebアプリケーションにAjaxクライアントがあります。 クロスドメインの問題に関しては、GET ajax呼び出しに問題はありませんが、POST ajax呼び出しに問題があります。私はこれがドメイン間の問題であるとは確信していません。 とにかく、GET ajaxがWCFサービスを正常に呼び出すが、POST ajax呼び出しの場合はそうではない。jQuery Ajax POSTコールでWCFサービスが呼び出されない

WCFサービス

[OperationContract] 
[WebInvoke(Method = "POST", UriTemplate = "UserService/AddUser", BodyStyle = WebMessageBodyStyle.WrappedRequest)] 
public User AddUser(User input) 
{ 
    var user = input; 

    // Do something business logic 

    return user; 
} 

Global.asaxのは、WCFサービスが

HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*"); 
      if (HttpContext.Current.Request.HttpMethod == "OPTIONS") 
      { 
       HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST"); 
       HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept"); 
       HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000"); 
       HttpContext.Current.Response.End(); 
      } 

Ajaxコード

<script type="text/javascript"> 
     $(document).ready(function() { 

      $("#submit").click(function() { 
       $.ajax({ 
        cache: false, 
        type: "POST", 
        async: false, 
        url: "http://localhost:2000/UserService/AddUser", 
        data: { "LoginId" : $("#LoginId").val(), "Name" : $("#Name").val() }, 
        contentType: "application/json; charset=utf-8", 
        dataType: "json", 
        processData: true, 
        success: function (userViewModel) { 
         var user = userViewModel; 
         alert(user); 
        } 
       }); 
      }); 
     }); 
    </script> 

を常駐するWebアプリケーションに私はChromeブラウザとI中の開発者ツールとそれをデバッグ次のメッセージが届いた

Request URL:http://localhost:2000/UserService/AddUser 
Request Method:POST 
Status Code:400 Bad Request 
Request Headersview source 
Accept:application/json, text/javascript, */*; q=0.01 
Accept-Charset:windows-949,utf-8;q=0.7,*;q=0.3 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4 
Connection:keep-alive 
Content-Length:18 
Content-Type:application/json; charset=UTF-8 
Host:localhost:2000 
Origin:http://localhost:3000 
Referer:http://localhost:3000/views/useradd.html 
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.77 Safari/535.7 
Request Payload 
LoginId=11&Name=22 
Response Headersview source 
Access-Control-Allow-Origin:* 
Cache-Control:no-cache, no-store 
Connection:Close 
Content-Length:1760 
Content-Type:text/html 
Date:Tue, 14 Feb 2012 05:56:42 GMT 
Expires:-1 
Pragma:no-cache 
Server:ASP.NET Development Server/10.0.0.0 
X-AspNet-Version:4.0.30319 

あなたが400 Bad Requestと表示しているように、これは問題がドメイン間の問題に関連していることを疑った理由です。しかし、私は確信していません。

この問題の原因を推測できますか? ありがとうございます。

+0

の可能重複[WCF REST方式にはJQueryからJSONデータを送信する問題](http://stackoverflow.com/questions/4875195/problem-sending-json-data-from-jquery-to-wcf-rest-method) – Ray

答えて

0

私は問題はあなたがdataパラメータに他の値を使用する必要がありますので、あなたは、メッセージ本文の別の形式を使用する必要があることだと思う:

data: JSON.stringify({ 
    LoginId: $("#LoginId").val(), 
    Name : $("#Name").val() 

}) 

データ表現の異なるフォーマットが依存含まthe answerを参照してください。使用するBodyStyle属性。

0

ポートが異なるため、クロスドメインの問題である可能性があります。

Google Chrome Devツールでは、その上にレスポンスタブが表示されるはずです。レスポンスにはエラーが発生している可能性があります。なぜなら、同じツールのコンソールがその情報を提供するからです。

0

サービスがクロスドメインの問題を解決するため、ポート80でサービスをホストしてみてください。

0

1 - あなたが設定を確認してくださいcrossDomainScriptAccessEnabled="true"webHttpBinding

設定ファイルは、あなたの方法を取得resquestため

を、以下のような内装が施されなければならない

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

    <system.web> 
    <compilation debug="true"/> 
    </system.web> 

    <system.serviceModel> 

    <bindings> 
     <webHttpBinding> 
     <binding name="crossDomain" crossDomainScriptAccessEnabled="true" /> 
     </webHttpBinding> 
    </bindings> 

    <behaviors> 

     <serviceBehaviors> 
     <behavior> 
      <!-- 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="false"/> 
     </behavior> 
     </serviceBehaviors> 

    </behaviors> 

    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    <httpProtocol> 
     <customHeaders> 
     <add name="Access-Control-Allow-Origin" value="*" /> 
     <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS" /> 
     <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" /> 
     <add name="Access-Control-Max-Age" value="1728000" /> 

     </customHeaders> 
    </httpProtocol> 
    </system.webServer> 

</configuration> 

2-次のようにする必要があります:

[OperationContract] 
[WebGet(UriTemplate = "/Dowork/{name}/{action}", ResponseFormat = WebMessageFormat.Json)] 
CompositeType DoWork(string name, string action); 

ポストリクエスト用:

[WebInvoke(UriTemplate = "/DoworkPOST/{name}", Method = "POST", ResponseFormat = WebMessageFormat.Json,RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)] 
[OperationContract] 
CompositeType DoWorkPost(string name, string action1, string action2); 

3-にJavaスクリプトあなたは

//for get 
    function testGet() { 
     $.ajax({ 
      url: 'http://www.yourhost.com/yourservicename.svc/DoWorkPost/azadeh1', 
      success: function (data) { 
       $("#result").html('Load was performed' + data); 
      } 
     }); 


    } 

    //for post 
    var testobj = { action1: "cook", action2: "dance" }; 
    function testPost() { 
     $.ajax({ 
      type: "POST", 
      url: 'http://www.yourhost.com/yourservicename.svc/DoWorkPost/azadeh', 
      data: JSON.stringify(testobj), 
      crossDomain:true, 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      processdata: false, 
      success: function (data) { 
       $("#result").html('Load was performed' + data); 
      }, 
      error: function(jqXHR, textStatus, errorThrown) { 
       $("#result").text(textStatus); 
      } 
     }); 


    } 

4 - あなたのSVCファイルをチェックし、次のようにアクセスすることができます

<%@ ServiceHost Language="C#" Debug="true" Service="namespace.servicename" CodeBehind="servicename.svc.cs" Factory="System.ServiceModel.Activation.WebServiceHostFactory"%> 
関連する問題