JQuery Ajax POST не вызывает службу WCF - PullRequest
0 голосов
/ 14 февраля 2012

У меня есть служба WCF в веб-приложении и клиент Ajax в другом веб-приложении. Что касается междоменной проблемы, у меня нет проблем с вызовом ajax GET, но у меня есть проблема с вызовом ajax POST. Я не уверен, что это из междоменной проблемы, хотя. В любом случае, когда GET ajax успешно вызывает службу WCF, но это не происходит в случае вызова POST ajax.

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 и получил следующее сообщение

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, поэтому я сомневаюсь, что проблема связана с междоменной проблемой. Но я не уверен.

Можете ли вы угадать причину этой проблемы? Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 29 ноября 2012

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 - ваш метод должен быть оформлен следующим образом

для получения запроса:

[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"%>
0 голосов
/ 14 февраля 2012

Я предполагаю, что это может быть междоменной проблемой, так как порты разные.

Инструмент Google Chrome Dev может дать больше информации об этом, вы должны увидеть там вкладку ответа, в ответе может быть ошибка, почему запрос не выполнен, также консоль того же инструмента может дать больше информации об этом.

0 голосов
/ 19 марта 2012

Попробуйте разместить службу на порте 80, поскольку это решает проблему междоменных доменов.

0 голосов
/ 14 февраля 2012

Я думаю, что проблема в том, что вы должны использовать другой формат тела сообщения, поэтому вы должны использовать другое значение для параметра data:

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

})

См. ответ , где включены различные форматы представления данных, зависит от атрибута BodyStyle, который вы используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...