2012-05-17 2 views
2

У меня есть цель WCF REST сервиса для .NET Framework 4. Я использую стандартную конечную точку WebScriptEndPoint и используя основной authroizationWCF4 REST Междоменного с Jquery

Когда я потребляю эту услугу с помощью JQuery работает нормально, когда у меня есть страница с одним и тем же сервисным приложением, то есть http://localhost. Но если я использую эту услугу с помощью другого веб-приложения, то есть http://localhost:20984, он не работает. Скрипач показывает, когда я пытаюсь http://localhost/WebHttpBindTest/JSONAPIDemo.aspx

GET http://localhost/WebHttpBindTest/Service.svc/GetData?value=some&callback=jsonp1337264181292&_=1337264186941 HTTP/1.1 
Accept: text/javascript, application/javascript, */* 
Accept-Language: en-us 
Referer: http://localhost/WebHttpBindTest/JSONAPIDemo.aspx 
Authorization: Basic Y2RtdXNlcjpjZG1wYXNzd29yZA== 
x-requested-with: XMLHttpRequest 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E) 
Host: localhost 
Connection: Keep-Alive 
Cookie: __utma=37822774.11348549.1335971819.1337185885.1337195810.36; __utmz=37822774.1335971819.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none) 

Но когда я пытаюсь из веб-приложения

GET http://localhost/WebHttpBindTest/Service.svc/GetData?value=fdsafa&callback=jsonp1337264499382&_=1337264533468 HTTP/1.1 
Accept: application/javascript, */*;q=0.8 
Referer: http://localhost:20984/WebSite1/Demo.htm 
Accept-Language: en-US 
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0) 
Accept-Encoding: gzip, deflate 
Host: localhost 
Connection: Keep-Alive 

См заголовок Authorization отсутствует, когда я отправить с помощью веб-приложений страницу.

Похоже, что это проблема с перекрестным доменом. Включить crossdomainscriptAccess сделал т.е.

Вот это служба контракта:

[ServiceContract] 
public interface IService 
{ 
    [WebGet(ResponseFormat = WebMessageFormat.Json)] 
    [OperationContract] 
    string GetData(string value); 

} 

Web.config

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 
    <services> 
     <service name="Service" behaviorConfiguration="auth"> 
     <endpoint address="" kind="webScriptEndpoint" contract="IService" /> 
     </service> 
    </services> 
    <standardEndpoints> 
     <webScriptEndpoint> 
     <standardEndpoint crossDomainScriptAccessEnabled="true"> 
     </standardEndpoint> 
     </webScriptEndpoint> 
    </standardEndpoints> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="auth"> 
      <serviceAuthorization serviceAuthorizationManagerType="BasicAuth.BasicAuthorization, BasicAuth" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 

JQuery форма:

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title></title> 
    <script src="Base64.js" type="text/javascript"></script> 
    <script src="jquery.min.js" type="text/javascript" language="javascript"></script> 
    <script type="text/javascript"> 
     var Type; 
     var Url; 
     var Data; 
     var ContentType; 
     var DataType; 
     var ProcessData; 
     function CallService(successfn,auth) { 
      var addHeaders = function (xhr) { 
       xhr.setRequestHeader("Authorization", auth); 
      }; 

      $.ajax({ 
       type: Type, //GET or POST or PUT or DELETE verb 
       url: Url, // Location of the service 
       data: Data, //Data sent to server 
       contentType: ContentType, // content type sent to server 
       dataType: DataType, //Expected data format from server 
       processdata: ProcessData, //True or False 
       beforeSend: addHeaders, 
       success: function (msg) {//On Successfull service call 
        successfn(msg); 
       }, 
       error: ServiceFailed// When Service call fails 
      }); 
     } 
     function make_base_auth(user, pass) { 
      var tok = user + ':' + pass; 
      var hash = Base64.encode(tok); 
      return "Basic " + hash; 
     } 
     function getUrl() { 
      var auth = make_base_auth('user', 'password'); 
      Type = "GET"; 
      Url = "http://localhost/WebHttpBindTest/Service.svc/GetData?value=" + $('#txtCode').val(); 
      ContentType = "text/json; charset=utf-8"; 
      DataType = "jsonp"; 
      ProcessData = true; 

      CallService(ServiceSucceeded,auth); 
     } 


     function ServiceSucceeded(result) { 
      var resultObject = null; 

      if (DataType == "jsonp") { 
       if (Url.indexOf(".asmx/") > 0) { 
        resultObject = result.d; 
       } 
       else { 
        $("#div1").html("Result:" + result); 
       } 
      } 
     } 
     function ServiceFailed(result) { 
      alert('Service call failed: ' + result.status + '' + result.statusText); 
      Type = null; Url = null; Data = null; ContentType = null; DataType = null; ProcessData = null; 
     } 
    </script> 
</head> 
<body> 
    <div id="container"> 

     <h1>JSON API Demo</h1> 

     <div> 
      <p>Type Something: <input type="text" id="txtCode" /> 
      <button type="submit"value="submit" id="btnGetUrl" onclick="getUrl()">Get</button> 
     </div> 
     <br /><br /> 
     <center><div id="div1" style="font-size:larger"></div> </center> 
</div> 
</body> 
</html> 

ответ

0

Если вы хотите доступ t конечная точка через jQuery, вы должны использовать стандартную конечную точку <webHttpEndpoint>, а не <webScriptEndpoint>. webScriptEndpoint s должен использоваться только для клиентов, которые используют только инфраструктуру ASP.NET AJAX.

+0

Спасибо, что ответили. Я даже попытался с помощью стандартной конечной точки , по-прежнему имеет такую ​​же проблему. Я получаю ответ, если я использую страницу с помощью службы, то есть localhost. Но если я использую его из webapplication, то есть local: 20984, никакого ответа. Если я посмотрю на Fiddler, он не будет прикреплять заголовок авторизации из веб-приложения. Я даже попытался отключить авторизацию при обслуживании webscriptendpoint работает как для localhost, так и для localhost: 20984. Но webHttpEndpoint не работает для localhost: 20984, т. Е. Веб-приложение – user1401299

+0

Карлос, спасибо, что потратили время на создание статьи. Я попытаюсь использовать это http://blogs.msdn.com/b/carlosfigueira/archive/2012/05/15/implementing-cors-support-in-wcf.aspx – user1401299