Вызов службы WCF для Winform из javascript - PullRequest
2 голосов
/ 10 октября 2010

У меня есть служба WCF для Winform с конечной точкой Ajax Web.

У меня также есть проект ASP.NET отдельно, с компонентом ScriptManager на странице.

У меня вопрос: должно ли это сработать, если я выполняю вызовы служб к моей размещенной службе Winform из клиентской части приложения ASP.NET с использованием javascript?

Моя страница ASP.NET по умолчанию выглядит следующим образом:

<script type="text/javascript">    
function Button1_onclick() {        
// ????How to call a service method?????    
}
</script>

<asp:ScriptManager ID="ScriptManager1" runat="server">
    <Services>
           <asp:ServiceReference Path="http://localhost:8000/web" />  //My winform hosted service
    </Services>
</asp:ScriptManager>

Или я должен разместить свой сервис в IIS, чтобы его можно было использовать в AJAX?

Ответы [ 3 ]

1 голос
/ 25 мая 2011

Независимо от того, являетесь ли вы хостингом или IIS, предоставляющим сервис WCF, если ваш веб-сайт и сервис не имеют один и тот же адрес (протокол, имя сервера, порт), вы столкнетесь с ограничениями XSS (межсайтовый скриптинг).1001 *

В документации MSDN по ServiceReference.Path указано:

"Свойство Path может указывать только на локальные веб-службы. Другими словами, это свойство может указывать только на веб-службыв том же домене, что и веб-приложение ASP.NET с поддержкой AJAX. Путь может быть относительным, относительным к приложению, относительным к домену или абсолютным путем. "

2 лучших варианта:

  1. Создайте локальный прокси-сервер, то есть скопируйте интерфейс службы в локальной сети, а затем передайте запрос веб-службе из кода.
  2. Измените службу, чтобы она возвращала свой результат в формате JSON.Это позволит вам добавить динамический тег сценария для извлечения результатов.

Обе эти опции выделены здесь .

1 голос
/ 27 мая 2011

Оказалось довольно просто с правильной конфигурацией сервиса:

<endpoint address="Web/" binding="webHttpBinding" contract="IMyService"  
          behaviorConfiguration="WebBehavior"/>
<!-- ... -->
<endpointBehaviors>
    <behavior name="WebBehavior">
        <webHttp defaultOutgoingResponseFormat="Json" defaultBodyStyle="Wrapped" />
    </behavior>
</endpointBehaviors>

Я также добавил атрибут WebInvoke в свой контракт на обслуживание:

[WebInvoke(Method = "POST")]
public interface IMyService {
    // ...
}

С этой конфигурацией вы можете позвонить в сервисный метод, просто используя ваш браузер. Так что javascript должен только сделать HTTP-запрос POST к URL, это тривиальная задача, которая не требует каких-либо вещей ASP.NET ServiceManager. JQuery образец:

<script type="text/javascript"> 
function Button1_onclick() {        
    $.ajax({
        type: "POST",
        url: "http://localhost:8000/web/",
        data: "",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        processdata: true
        success: function(msg) { /*...*/ },
        error: /*..error handler..*/
    });
}
</script>

В моем случае мне не нужно было передавать какие-либо параметры службе (фактически мой метод помечен как односторонний). Но добавление параметров лишь немного усложнит ситуацию (вы должны передать в качестве данных строку json вместо пустой строки).

0 голосов
/ 24 мая 2011

Вы можете разместить свой сервис WCF в любом месте, если:

  • он работает и работает, когда клиент подключается к нему
  • Вы указываете порт в коде клиента
  • Ваш брандмауэр не блокирует используемый порт (должно быть в порядке, если клиент и сервер работают на одном компьютере)

Он не должен быть запущен в IIS.

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