Схожу с ума с этим вопросом. У меня есть решение с двумя проектами, один из них - простой старый html с вызовом jquery ajax, а другой - сервис WCF. Страница html вызовет ajax-вызов службы WCF, чтобы получить строку json и использовать ее для отображения.
Теперь проблема в том, что всякий раз, когда я запускаю в режиме отладки, и html-страница, и WCF будут запускаться с другим портом. И это создало для меня проблему с перекрестным происхождением, когда я выполняю тестирование (т.е. получаю ошибку 405 Method Not Allowed с типом вызова = OPTIONS в Firefox). Я бы трижды проверил метод вызова в моем сценарии ajax, и служба WCF такая же (GET).
Я поискал в Google, но обнаружил, что либо мне нужно установить расширение, либо выполнить некоторую настройку в IIS, что я нашел громоздким, поскольку то, что я делаю, является чем-то простым. Следуя одному примеру, я бы добавил следующую конфигурацию в свой web.config, но это не сработало:
<system.serviceModel>
<bindings>
<webHttpBinding>
<binding name="crossDomain" crossDomainScriptAccessEnabled="true" />
</webHttpBinding>
</bindings>
<behaviors>
<endpointBehaviors>
<behavior name="MobileService.webHttpBehavior">
<webHttp />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="MyServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
<services>
<service name="MobileService.SimpleMemberInfo" behaviorConfiguration="MyServiceBehavior">
<endpoint address="" binding="webHttpBinding" contract="MobileService.IMemberInfo" bindingConfiguration="crossDomain" behaviorConfiguration="MobileService.webHttpBehavior">
</endpoint>
</service>
</services>
</system.serviceModel>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET" />
<add name="Access-Control-Allow-Headers" value="Content-Type, Accept" />
</customHeaders>
</httpProtocol>
<modules runAllManagedModulesForAllRequests="true"/>
<directoryBrowse enabled="true"/>
</system.webServer>
У кого-нибудь есть идея избавиться от этой досадной проблемы?
РЕДАКТИРОВАТЬ: Чтобы добавить, я запускаю отладку с помощью IIS Express, который поставляется вместе с VS Studio 2012.
Добавить код WCF и обновить файл web.config
[ServiceContract]
public interface IMemberInfo
{
[WebInvoke(Method = "GET",
BodyStyle = WebMessageBodyStyle.Wrapped,
ResponseFormat = WebMessageFormat.Json
)]
[OperationContract]
string GetMemberInfoById();
// TODO: Add your service operations here
}
Мой сценарий:
$(document).ready(function () {
$.ajax("http://localhost:32972/SimpleMemberInfo.svc/GetMemberInfoById", {
cache: false,
beforeSend: function (xhr) {
$.mobile.showPageLoadingMsg();
},
complete: function () {
$.mobile.hidePageLoadingMsg();
},
contentType: 'application/json',
dataType: 'json',
type: 'GET',
error: function () {
alert('Something awful happened');
},
success: function (data) {
var s = "";
s += "<li>" + data + "</li>";
$("#myList").html(s);
}
});
});
