Я знаю, что есть много вопросов по этому поводу - поверьте мне, я прочитал многие из них и попробовал ответы.
(Этот проект предназначен для внутренней компании, а не для Интернета)
У нас есть веб-сервис WCF, который является RESTFUL и отправляет / получает JSON, для него требуются NTLM (Curb также подойдет) аутентификации / учетных данных, чтобы гарантировать, что вызывающий пользователь (из браузера является тем, кем они говорят) и согласовывается между браузером / клиентом и службой привязками WCF:
<bindings>
<webHttpBinding>
<binding name="webHttpBindingAuth">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Ntlm"/>
</security>
</binding>
</webHttpBinding>
</bindings>
Используя Fiddler, я могу успешно вызывать методы службы GET и POST, и при условии, что я настраиваю JSON, который мы отправляем в веб-службу (например, для включения идентификатора сеанса), он счастливо перемещается.
Проблемы начались, когда мы попытались использовать JavaScript / jQuery для вызова веб-службы; Идея состоит в том, что веб-сервер будет предоставлять HTML / JS браузеру клиента, затем браузер должен вызвать веб-сервис WCF, чтобы получить сеанс и позволить пользователю выполнить несколько действий (всего у нас 3 метода).
Во-первых, мы столкнулись с проблемой X-Domain, которую мы попытались решить, получив веб-сервер *1013*, возвращающий правильные заголовки (Access-Control-Allow-Origin). Это не помешало браузерам, таким как SRIron, сообщить нам об этом;
XMLHttpRequest cannot load http://{webServiceUri}/InstantMessagingService/chat/start/{username}. Origin http://{web**Server**Uri} is not allowed by Access-Control-Allow-Origin.
После этого я исследовал возможность использования Silverlight (похоже, не поддерживает аутентификацию NTLM через WebHttpBinding), обратный прокси-сервер отключен, поскольку сервер IIS, используемый в dev, не будет использоваться в prod (I верю это WebSphere, но не под нашим контролем); Затем я посмотрел на это:
http://msmvps.com/blogs/paulomorgado/archive/2007/04/27/wcf-building-an-http-user-agent-message-inspector.aspx
Из-за этого у меня сложилось впечатление, что веб-сервис WCF на самом деле был тем, что нужно сообщать браузеру, откуда ему разрешено вызываться (если это имеет смысл). Реализовав весь код из примера, я обнаружил, что ApplyClientBehavior никогда не вызывался, чтобы попытаться вернуть заголовки клиенту (отслеживая это и в Fiddler). Еще немного Гуглинга привело меня к:
http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/707aa031-f4ff-47ab-ba5b-730f7930605e/
Так как мы обращаемся к веб-сервису с помощью jQuery, а не некоторого .NET-клиента / ссылки на службу / прокси / приложения ... бла, я думаю, что невозможно предварительно отправить эти заголовки, чтобы разрешить доступ к сервис. Кроме того, Fiddler, кажется, думает, что получает 401 Unauthorized, когда он пытается вызвать метод http: //../chat/start/ ...
Вот jQuery, который я использую, чтобы попытаться сделать звонок (я предоставил несколько настроек в надежде, что он будет работать):
var url = webserviceUrl + "chat/start/" + remoteUserUri;
$.ajax({
type: 'GET',
url: url,
crossDomain: true,
beforeSend: function(xhr){ xhr.withCredentials = true; },
contentType: "application/json; charset=utf-8",
success: function (data) { conversationStarted(data); },
dataType: 'json'
});
Хорошо, если у кого-то есть полезные советы или идеи, пожалуйста, откажитесь. Я отвечу, отредактирую и т. Д., Чтобы убедиться, что это актуально, надеюсь, я ничего не пропустил (но мои головы немного кружатся от моего поиска в Google).
Кроме того, я знаю, что, возможно, есть лучшие способы сделать это, но я бы хотел сделать это самым чистым / быстрым способом, чем там, где я сейчас нахожусь - то есть не так много изменений кода, переписывает и т. Д. Я могу также публикуйте конфиги, если люди считают, что они действительно полезны.