2012-02-14 2 views
0

У меня есть служба WCF в веб-приложении и есть клиент 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> 

Я отлажена его с разработчиками инструмента в браузере 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

возможно дубликат [Проблема отправки данных в формате JSON с JQuery для метода WCF REST ] (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

Конфигурационный файл должен быть как следующее

<?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- ваш метод должен оформлен как следующий

для получения resquest:

[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 Script вы можете получить доступ, как следующий

//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"%> 
Смежные вопросы