Вызов WCF / JSON / REST WebService из JavaScript с использованием jQuery / Ajax - PullRequest
9 голосов
/ 01 июня 2011

Я знаю, что есть много вопросов по этому поводу - поверьте мне, я прочитал многие из них и попробовал ответы.

(Этот проект предназначен для внутренней компании, а не для Интернета)

У нас есть веб-сервис 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).

Кроме того, я знаю, что, возможно, есть лучшие способы сделать это, но я бы хотел сделать это самым чистым / быстрым способом, чем там, где я сейчас нахожусь - то есть не так много изменений кода, переписывает и т. Д. Я могу также публикуйте конфиги, если люди считают, что они действительно полезны.

Ответы [ 2 ]

3 голосов
/ 08 июня 2011

В конце концов мне пришлось немного поработать, мы заставили ребят, отвечающих за веб-сервер, согласиться обслуживать IFrame, который указывает на нашу размещенную на IIS страницу (страницу, содержащую JS и т. Д.)

Затем, используя магию WCF / Windows, мы размещаем сервисы WCF на порте 80, который обходит источник X-Domain.Таким образом, я могу получить REST / JSON без необходимости использования JSONP.

Я знаю, что это не ответ на вопрос, учитывая указанные мной критерии, но я думаю, что в итоге у меня закончились варианты.

2 голосов
/ 01 июня 2011

Можете ли вы использовать JSONP?Это решит вашу междоменную проблему в одно мгновение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...