2012-05-31 3 views
1

У меня есть следующий веб-сервис, созданный и использующий самую последнюю версию jquery, которую мне нужно отправить в веб-службу.Перекрестный домен AJAX Post - WCF

Я не могу понять это. Я читал, что JSONP не будет работать с POST. Как мне заставить это работать?

Мне нужно сделать перекрестный домен, используя jQuery для WCF.

service.cs:

namespace AjaxPost 
{ 
    [DataContractAttribute] 
    public class Message 
    { 
     [DataMemberAttribute] 
     public string success; 

     public Message(string success) 
     this.success = success; 
    } 


    [ServiceContract(Namespace="JsonpAjaxService")] 
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
    public class User 
    { 
     [WebInvoke(ResponseFormat = WebMessageFormat.Json, Method="POST")] 
     public Message CreateUser(string email, string username, string password, string phone, string image) 
     { 
      Message msg = new Message("true"); 
      return msg; 
     } 
    } 
} 

service.svc:

<%@ServiceHost 
    language="c#" 
    Debug="true" 
    Service="Microsoft.Samples.Jsonp.CustomerService" 
    Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory" 
%> 

Сервис Web.Config:

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    <httpProtocol> 
     <customHeaders> 
      <add name="Access-Control-Allow-Origin" value="*" /> 
      <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE" /> 
     </customHeaders> 
    </httpProtocol> 
</system.webServer> 

<system.serviceModel>   
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="MetadataBehavior"> 
       <serviceDebug includeExceptionDetailInFaults="True" httpHelpPageEnabled="True" /> 
       <serviceMetadata httpGetEnabled="True"/> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 
    <standardEndpoints> 
     <webScriptEndpoint> 
      <standardEndpoint name="" crossDomainScriptAccessEnabled="true"/> 
     </webScriptEndpoint> 
    </standardEndpoints> 
</system.serviceModel> 

index.html

wcfServiceUrl = "http://localhost:33695/Service.svc/CreateUser"; 

    $.ajax({ 
     crossDomain: true, 
     cache: true, 
     url: wcfServiceUrl, 
     data: "{}", 
     type: "POST", 
     jsonpCallback: "Message", 
     contentType: "application/json", 
     dataType: "json", 
     data: "{ \"myusername\": \"mypassword\" }", 
     error: function (request, status, error) { 
      //error loading data 
      alert("error"); 
     }, 
     success: function (menu) { 
      alert('success'); 
     } 
    }); 

ответ

0

Я нашел решение, используя Корс (HTML 5 Solution) http://code.msdn.microsoft.com/windowsdesktop/Implementing-CORS-support-c1f9cd4b

Если кто-нибудь знает, работающее решение, которое не использует CORS (HTML 5), который был бы здорово. Исправьте меня, если я ошибаюсь, но для CORS требуются браузеры с поддержкой HTML 5, и я предпочитаю решение, которое не зависит от браузера HTML 5.

+0

FYI, Edge, похоже, в настоящее время не поддерживает CORS ... если у меня что-то не так с моей реализацией этой ссылки, но она работает во всех других браузерах. – xr280xr

0

В связи с http-стандартами политика такого же происхождения может быть затронута. Веб-сайт, который вы запрашиваете, находится в другом приложении или порту?

См:

http://en.wikipedia.org/wiki/Same_origin_policy

+0

Как я уже говорил, веб-служба и веб-приложения находятся на разных хостах. Это перекрестная доменная почта, которую я пытаюсь выполнить. – PsychoDUCK

+0

Тогда вам понадобится запрос SOAP или что-то подобное. Вы можете отправить запрос ajax методу в контексте веб-приложения, пытающегося связаться с веб-службой, а затем выполнить запрос SOAP. – dardo

+0

Что я пытаюсь использовать У меня проблемы. Я пробовал каждый ответ, который я нашел в Интернете. Я просто получил CORS для работы с WCF. Я надеялся не использовать CORS, поскольку он поддерживается только новыми браузерами, запускающими html 5. Решение, которое не запускает CORS, было бы неплохо увидеть. Простой пример jquery post для WCF был бы приятным. Я отправлю пример CORS в качестве ответа, и я изменю свой ответ, если кто-нибудь сможет опубликовать рабочий пример, который не использует CORS. – PsychoDUCK

1

Я сделал это без CORS. Все, что я должен был сделать, это разрешить серверу получать звонки из любого места. Это было сделано с помощью apache, но я вижу, что ваш веб-сервер имеет нечто похожее. Проблема, которая у меня была, заключалась в том, что мне нужно было указать разрешенный домен, * не работал. Кроме того, это должно было быть указано с http://site.example

1

у вас нет выбора, кроме как использовать приложение serveride для подключения вашего веб-сервиса, если оно лежит на другом сервере. Или просто используйте JSONP (получить запросы). нет другой работы. CORS не работает в старых браузерах.

0

У меня есть простое решение, которое работает. Для решения проблемы необходимо выполнить следующие действия:

Создать Global.asax и следующий код, чтобы включить Ajax Междоменного POST

public void Application_BeginRequest(object sender, EventArgs e) 
     { 
      HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*"); 
      HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST,OPTIONS"); 

      if ((HttpContext.Current.Request.HttpMethod == "OPTIONS")) 
      { 

       HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept"); 
       HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000"); 
       HttpContext.Current.Response.End(); 
      } 
     } 
    } 
Смежные вопросы