У меня есть цель 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>
Спасибо, что ответили. Я даже попытался с помощью стандартной конечной точки, по-прежнему имеет такую же проблему. Я получаю ответ, если я использую страницу с помощью службы, то есть localhost. Но если я использую его из webapplication, то есть local: 20984, никакого ответа. Если я посмотрю на Fiddler, он не будет прикреплять заголовок авторизации из веб-приложения. Я даже попытался отключить авторизацию при обслуживании webscriptendpoint работает как для localhost, так и для localhost: 20984. Но webHttpEndpoint не работает для localhost: 20984, т. Е. Веб-приложение –
user1401299
Карлос, спасибо, что потратили время на создание статьи. Я попытаюсь использовать это http://blogs.msdn.com/b/carlosfigueira/archive/2012/05/15/implementing-cors-support-in-wcf.aspx – user1401299