powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Call Self-Hosting WCF Service from web-client javascript
25 сообщений из 25, страница 1 из 1
Call Self-Hosting WCF Service from web-client javascript
    #36904002
Фотография iConst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем.
Вопрос к знатокам WCF: Сабж - как?

Дано: Обыкновенный WCF SHS ака консольное приложение. Все по дефолту. Утилитой WcfTestClient вызываем метод сервиса - ОК. Можем получить WSDL и т.п.
Например:
базовый урл: http://localhost:8888/hello
метод: public string SayHello(string name){return "Hello " + name;}
Код, думаю, приводить не имеет смысла, приведу только контракт:
contract<wsdl:definitions name="HelloWorldService" targetNamespace="http://tempuri.org/">

<wsdl:types>

<xsd:schema targetNamespace="http://tempuri.org/Imports">
<xsd:import schemaLocation="http://localhost:8888/hello?xsd=xsd0" namespace="http://tempuri.org/"/>
<xsd:import schemaLocation="http://localhost:8888/hello?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/"/>
</xsd:schema>
</wsdl:types>

<wsdl:message name="HelloWorldService_SayHello_InputMessage">
<wsdl:part name="parameters" element="tns:SayHello"/>
</wsdl:message>

<wsdl:message name="HelloWorldService_SayHello_OutputMessage">
<wsdl:part name="parameters" element="tns:SayHelloResponse"/>
</wsdl:message>

<wsdl:portType name="HelloWorldService">

<wsdl:operation name="SayHello">
<wsdl:input wsam:Action="http://tempuri.org/HelloWorldService/SayHello" message="tns:HelloWorldService_SayHello_InputMessage"/>
<wsdl:output wsam:Action="http://tempuri.org/HelloWorldService/SayHelloResponse" message="tns:HelloWorldService_SayHello_OutputMessage"/>
</wsdl:operation>
</wsdl:portType>

<wsdl:binding name="BasicHttpBinding_HelloWorldService" type="tns:HelloWorldService">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>

<wsdl:operation name="SayHello">
<soap:operation soapAction="http://tempuri.org/HelloWorldService/SayHello" style="document"/>

<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>

<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>

<wsdl:service name="HelloWorldService">

<wsdl:port name="BasicHttpBinding_HelloWorldService" binding="tns:BasicHttpBinding_HelloWorldService">
<soap:address location="http://localhost:8888/hello"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

Вот как вызвать из, например, jQuery/$.ajax()?

Вызов IIS-Hosted сервиса выглядел-бы так: http://localhost:8888/myservice.svc/SayHello и POST-данные {name:"Вася"}

Здесь такой метод не прокатывает. Кто делал подобное?

Перевернув мир - оглянись, может перевернулся ты сам?!
...
Рейтинг: 0 / 0
Call Self-Hosting WCF Service from web-client javascript
    #36904478
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iConst...

Здесь такой метод не прокатывает.
...

Почему, собс-нно, "не прокатывает"?
Если биндинги настроены на использование HTTP (например: WSHttpBinding), то селф-хостинг приложение ничем не отличается от обычного веб-сервера. Если биндинги сокето-бинарные, то никакой jQuery, ес-с-нно, к хосту обратиться не сможет.

З.Ы. может у вас файр-волл куда-то не пускает?
или политики назначения портов не дают селф-хосту открыть прослушку?
(такая фича по-умолчанию стоит на висте-7-рке, простейшее решение - запускать селф-хост с правами админа).
...
Рейтинг: 0 / 0
Call Self-Hosting WCF Service from web-client javascript
    #36904576
Фотография iConst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qu-qu,
По-порядку:
1) Селф-хост (консоль) запускается, с правами админа (иначе нужно прописывать доступ в неймспейсы - Вы уже отметили это) - ОК!
2) Утилита тест-клиента для службы демонстрирует правильную работу: вызываем, получаем что нужно.
3) В браузере вызывая http://localhost:8888/hello получаем стандартный ответ (ниже картинка)

Как мне вызвать эту службу, ведь базовый адрес http://localhost:8888/hello а не http://localhost:8888/myservice.svc

С помощью сгенерированного клиента работать нет проблем, но у меня стоит задача - вызов службы из простой хтмл-странички.

Можете оказать помощь? Готов выложить тестовые проекты и готовую службу.
...
Рейтинг: 0 / 0
Call Self-Hosting WCF Service from web-client javascript
    #36906970
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iConstqu-qu,
... Можете оказать помощь?
...

Могу, но не в ущерб своему рабочему времени (т.е. - когда придется).

Вот, посмотрите сюда (3 файлика):
1. простейший селф-хост на BasicHttpBinding (прямо из шаблона VS2010 и примера MSDN);
2. пример обращения к нему из WSH на javascript;
3. "пример" обращения из jQuery (у меня пока не заработал, т.к. браузерный XMLHttpRequest ограничивает кросс-доменные запросы, я пока не разобрался как из локального файла дернуть службу через HTTP).
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
using System;
using System.ServiceModel;

namespace ConsoleApplication1
{
    public class Program
    {
        public static void Main()
        {
            BasicHttpBinding binding = new BasicHttpBinding();
            binding.Name = "binding1";
            Uri baseAddress = new Uri(@"http://localhost:8000/service1");

            ServiceHost serviceHost = new ServiceHost(typeof(Service1), baseAddress);
            serviceHost.AddServiceEndpoint(typeof(IService1), binding, baseAddress);

            serviceHost.Open();

            Console.WriteLine("The service is ready.");
            Console.WriteLine("Press <ENTER> to terminate service.");
            Console.WriteLine(); Console.ReadLine();

            serviceHost.Close();
        }

    }

    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        string GetData(int value);

        // TODO: Add your service operations here
    }

    [ServiceBehavior(IncludeExceptionDetailInFaults=true)]
    public class Service1 : IService1
    {
        public string GetData(int value)
        {
            return string.Format("You entered: {0}", value);
        }
    }
}
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
var strURL, strBody;
strURL = "http://localhost:8000/service1";
strBody =  '<'+'soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">'+
                  '<'+'soap:Body>'+
                    '<'+'GetData xmlns="http://tempuri.org/">'+
                      '<'+'value>1088801<'+'/value>'+
                    '<'+'/GetData>'+
                  '<'+'/soap:Body>'+
                '<'+'/soap:Envelope>';
WScript.Echo(strURL, "\r\n", strBody);

var objHttp = new ActiveXObject("MSXML2.XmlHttp");
objHttp.open("POST", strURL, false);
objHttp.onreadystatechange = handleReadyStateChange;
objHttp.setRequestHeader("SOAPAction", "http://tempuri.org/IService1/GetData");
objHttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8");

objHttp.send(strBody);

WScript.Quit();

function handleReadyStateChange() {
    if (objHttp.readyState == 4) {
        WScript.Echo(objHttp.status);
        WScript.Echo(objHttp.statusText);
        WScript.Echo(objHttp.getAllResponseHeaders());
        WScript.Echo(objHttp.responseText);
    }
}
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
<html>
<head>
    <script language="javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
</head>
<body>
    <div id="results"></div>
    <script language="javascript">
        $(
            function () {
                $.ajax( {
                  type: 'POST',
                  url:  'http://localhost: 8000 /service1',
                  data: '<'+'soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">'+
                              '<'+'soap:Body>'+
                                '<'+'GetData xmlns="http://tempuri.org/">'+
                                  '<'+'value> 1088801 <'+'/value>'+
                                '<'+'/GetData>'+
                              '<'+'/soap:Body>'+
                            '<'+'/soap:Envelope>',
                  success: function (data, textStatus, xhr) {
                          $('#results').html(escape(xhr.responseText));
                  },
                  dataType: 'xml'
                });
        });
    </script>
</body>
</html>
...
Рейтинг: 0 / 0
Call Self-Hosting WCF Service from web-client javascript
    #36907148
Фотография iConst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qu-qu, Весьма признателен!
Да, кроссдоменный запрос будет блокирован браузером, но я вижу это так:
Разрешить службе выполнять GET-запросы (мой вариант)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
     static void Main(string[] args)
        {
            Uri baseAddress = new Uri("http://localhost:8888/hello");

            using(ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
            {
                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();

                smb.HttpGetEnabled = true;// allow GET requests  <=========

                smb.HttpGetBinding = new BasicHttpBinding();
                smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;

                host.Description.Behaviors.Add(smb);
                host.AddDefaultEndpoints();
                host.Open();

                Console.WriteLine("The service is ready at {0}", baseAddress);
                Console.WriteLine("Press <Enter> to stop the service.");
                Console.ReadLine();

                host.Close();
            }
        }
и перевести службу на работу в формате JSON и использовать JSONP. IIS-based службы автоматически отвечают в JSON, если в заголовке запрашивается этот формат. Здесь, похоже, не так просто - еще не разобрался...
Хотя многие считают это хаком, тем не менее это неплохо работает и работать будет.
...
Рейтинг: 0 / 0
Call Self-Hosting WCF Service from web-client javascript
    #36907202
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iConstqu-qu, Весьма признателен!
Да, кроссдоменный запрос будет блокирован браузером, но я вижу это так:
Разрешить службе выполнять GET-запросы ...
и перевести службу на работу в формате JSON и использовать JSONP...
...
Не за что...

Не уловил, почему GET-запросы и JSON помогут решить проблему кроссдоменных обращений из браузера?
(в любом случае - браузер будет открывать веб-сайт на одном http-web-хосте, ну типа как локальный файл с моим "примером", а ajax-ом ему нужно будет обращаться к другому wcf-self-хосту).

Ведь, если на http-web-хосте делать "проброску" JSON-ом, то городить огород с обращениями к wcf-self-хосту через http-soap (или http-json) нет смысла - можно для http-web-хоста и прокси-клиента сгенерить...
(если он, конечно, не на php).
...
Рейтинг: 0 / 0
Call Self-Hosting WCF Service from web-client javascript
    #36907242
Фотография iConst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qu-qu
Не за что...

Не уловил, почему GET-запросы и JSON помогут решить проблему кроссдоменных обращений из браузера?
(в любом случае - браузер будет открывать веб-сайт на одном http-web-хосте, ну типа как локальный файл с моим "примером", а ajax-ом ему нужно будет обращаться к другому wcf-self-хосту).

Ведь, если на http-web-хосте делать "проброску" JSON-ом, то городить огород с обращениями к wcf-self-хосту через http-soap (или http-json) нет смысла - можно для http-web-хоста и прокси-клиента сгенерить...
(если он, конечно, не на php).
В том-то и дело - нужно решить задачу локального веб-приложения на "чистом" ХТМЛ, без развертывания веб-сервера.
Преимущества:
1) можно запустить на любой вин-машине, а не только старших версий (IIS отсутствует)
2) простота развертывания - фактически одна служба, перевести в фоновый режим
3) простота модернизации пользовательского GUI
4) в принципе (поправьте ежели не так) можно запустить на *никсах: Wine + Mono
...
Рейтинг: 0 / 0
Call Self-Hosting WCF Service from web-client javascript
    #36907912
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iConst... и использовать JSONP.
...

Вот тут нарыл примерчик (надо скачать по ссылке вверху страницы, распаковать архив и посмотреть на код в солюшене <UnzipDirectory>\WCFWFCardSpace\WCF\Extensibility\Ajax\JSONP\CS\JSONP.sln).

З.Ы. там хост, конечно, IIS-ный, но, я думаю, что можно прикрутить это и к селф-хосту...
(вот тут еще немного про jQuery в ту же тему).

Если доведете "до ума" этот пример - чиркните сюда пару слов...
...
Рейтинг: 0 / 0
Call Self-Hosting WCF Service from web-client javascript
    #36908426
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iConst,

Вот еще отличный примерчик : тут и селф-хостинг, и json, и GET, и POST...
(все в одном флаконе, и что самое замечательное - работает сразу после копи-паста кода со страницы в консольное приложение).
...
Рейтинг: 0 / 0
Call Self-Hosting WCF Service from web-client javascript
    #36908725
Фотография iConst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qu-qu, ОК - обязательно проверю, немного по-позже: день-два, работа появилась.
...
Рейтинг: 0 / 0
Call Self-Hosting WCF Service from web-client javascript
    #36913954
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iConst,

ну вот, оказывается, что в 4-м фреймворке уже все сделали за нас... (надо только WebHttpBinding использовать):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
    public class Program
    {
        private static readonly string HOST_URL = "http://localhost:8000/jsonp";

        public static void Main(string[] args)
        {
            try
            {
                using (var serviceHost = GetConfiguredServiceHost(typeof(HelloJSONPService)
                                                                 , typeof(IHelloJSONPService)
                                                                 , new Uri(HOST_URL)))
                {
                    serviceHost.Open();
                    Console.WriteLine("WCF Service is running...");
                    Console.WriteLine(HOST_URL);
                    Console.ReadLine();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                Console.ReadLine();
            }
        }

        private static ServiceHost GetConfiguredServiceHost(Type typeService, Type typeContract, Uri uri)
        {
            var serviceHost = new WebServiceHost(typeService);

            var binding = new WebHttpBinding();
            // enabling jsonp output on ResponseFormat = WebMessageFormat.Json
            binding.CrossDomainScriptAccessEnabled = true;

            serviceHost.AddServiceEndpoint(typeContract, binding, uri);

            return serviceHost;
        }
    }
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<html>
  <head>
    <script language="javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
  </head>
  <body>
    <div id="results"></div>
    <script language="javascript">
      $(
          function () {
              $.getJSON('http://localhost: 8000 /jsonp/helloto/qu-qu?callback=?'
                        ,function (data) { $('#results').html(data); });
      });
    </script>
  </body>
</html>
...
Рейтинг: 0 / 0
Call Self-Hosting WCF Service from web-client javascript
    #36920203
Фотография iConst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qu-qu, Спасибо за пример - я тоже нечто подобное юзал :). Поигрался с сервисами - все неоднозначно. Получается, что ГЕТ- запросы с с паддингом (ваш пример) пользовать можно, а ПОСТ не прокатывает (я это и ожидал :) ) - на уровне браузера это все рубится. То-есть запрос проходит, сервис отвечает, но браузер (ФФ) говорит - нет данных. ИЕ, например, вообще молчит - даже не отправляет.
Если писать приложение, то только с заранее "загруженными" данными. Или пользоваться костылями, которые режут данные по 1к и отправляют их ГЕТ-запросами на сервис, где их потом нужно будет собирать :).

Еще немного поковыряю - потом отпишу...
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Call Self-Hosting WCF Service from web-client javascript
    #37729971
Ekstrem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите пожалуста, у меня схожая ситуация.
...
Рейтинг: 0 / 0
Call Self-Hosting WCF Service from web-client javascript
    #37729982
Ekstrem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: c#
1.
2.
3.
4.
5.
6.
7.
[OperationContract]
[WebGet(UriTemplate = "/test?input={input}")]
string Test(string input);

//...

public string Test(string input)  {return input; }



Код: xml
1.
2.
3.
4.
5.
6.
7.
      <webHttpBinding>
        <binding name="htmlBind" crossDomainScriptAccessEnabled="true">
          <security mode="None"/>          
        </binding>
      </webHttpBinding>
<service name="HRS.Business_Logic_Layer.PC" behaviorConfiguration="DebugBeh">
        <endpoint address="" binding="webHttpBinding" contract="HRS.Services_Layer.IPC" bindingConfiguration="htmlBind"/>


Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<html>
  <head>
    <script language="javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
  </head>
  <body>
    <div id="results"></div>
    <script language="javascript">
      $(
          function () {
			$.get("http://localhost/HRS/ProdigyChildren/test?input='go'", 
				function(data){alert("Data Loaded: " + data);});
      });
    </script>
  </body>
</html>



И скрипт ничего не возвращает :(
...
Рейтинг: 0 / 0
Call Self-Hosting WCF Service from web-client javascript
    #37759148
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ekstrem,

Разобрался?
...
Рейтинг: 0 / 0
Call Self-Hosting WCF Service from web-client javascript
    #37759354
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никто не сталкивался с ошибкой:
есть wcf служба, котоаря возвращает json.
есть скрипт на jquery , который дергает через POST метод, ссылку wcf службы.

запрос отправляется. принимается удачно. отправляется ответ.
на клиенте возникает ошибка. срабатывает error обработчик который не содержит информации.

ответ уходящий на клиента вполне нормальный:
Код: html
1.
2.
3.
4.
5.
6.
7.
HTTP/1.1 200 OK
Content-Length: 35
Content-Type: application/json; charset=utf-8
Server: Microsoft-HTTPAPI/2.0
Date: Wed, 18 Apr 2012 12:02:43 GMT

{"GetDataResult":"You entered: ee"}



вот такой скрипт:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
 <script>
      $(document).ready(function () {


          //          $.post("http://localhost:8732/ajax/ee",
          //             new function ( data) {
          //                 alert(data);
          //             },"json");

          $.ajax({
              type: "POST",
              url: "http://localhost:8732/ajax/ee",
              data: "{}",
              error: function (msg) {
                  // Hide the fake progress indicator graphic.
                  alert("error");
              },
              contentType: "application/json; charset=utf-8",
              dataType: "json",
              success: function (msg) {
                  // Hide the fake progress indicator graphic.
                  $('#RSSContent').removeClass('loading');

                  // Insert the returned HTML into the <div>.
                  $('#RSSContent').html(msg.d);
              }
          });

      });

 
  
  </script>



и код самого сервиса.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
<ServiceContract()>
Public Interface IService1
    <WebInvoke(UriTemplate:="/ajax/{ee}", Method:="POST", responseformat:=WebMessageFormat.Json, BodyStyle:=WebMessageBodyStyle.Wrapped)>
    <OperationContract()>
    Function GetData(ByVal ee As String) As String

    <OperationContract()>
    Function GetDataUsingDataContract(ByVal composite As CompositeType) As CompositeType
    <OperationContract()>
<WebInvoke(Method:="*",
           BodyStyle:=WebMessageBodyStyle.Bare,
           RequestFormat:=WebMessageFormat.Json,
           ResponseFormat:=WebMessageFormat.Json,
           UriTemplate:="*")>
    Function PostSomething(request As String) As String

    ' TODO: Add your service operations here

End Interface



и конфиг:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
<system.serviceModel>
    <bindings>
      <webHttpBinding>
        <binding name="NewBinding0" crossDomainScriptAccessEnabled="true" />
      </webHttpBinding>
    </bindings>
    <services>
      <service name="wcfhost.Service1">
        <clear />
        <endpoint address="" behaviorConfiguration="" binding="webHttpBinding"
          bindingConfiguration="" name="ajaxep" contract="wcfhost.IService1"
          kind="" endpointConfiguration="" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8732/" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="NewBehavior0">
          <webHttp helpEnabled="true" defaultBodyStyle="Bare" defaultOutgoingResponseFormat="Json"
            automaticFormatSelectionEnabled="false" faultExceptionEnabled="false" />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>



Не понимаю ошибка в том, что я возвратил данные не того формата или какая то другая ошибка?
...
Рейтинг: 0 / 0
Call Self-Hosting WCF Service from web-client javascript
    #37762692
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я приложил файлик, где wcf host и html страничка с js кодом, который обращается к сервису.

У меня все время срабатывает только error обработчик.
мои логи http:
Запрос:
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
OPTIONS http://localhost:8733/ajax/ee HTTP/1.1
Host: localhost:8733
User-Agent: Mozilla/5.0 (Windows NT 6.0; rv:11.0) Gecko/20100101 Firefox/11.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive
Origin: http://localhost
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Pragma: no-cache
Cache-Control: no-cache


ответ:
Код: html
1.
2.
3.
4.
5.
6.
7.
HTTP/1.1 200 OK
Content-Length: 0
Server: Microsoft-HTTPAPI/2.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST
Access-Control-Allow-Headers: Content-Type, Accept
Date: Fri, 20 Apr 2012 08:11:41 GMT



Запрос:
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
POST http://localhost:8733/ajax/ee HTTP/1.1
Host: localhost:8733
User-Agent: Mozilla/5.0 (Windows NT 6.0; rv:11.0) Gecko/20100101 Firefox/11.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive
Content-Type: application/json; charset=utf-8
Referer: http://localhost/wcfa/htmlpage.htm
Content-Length: 2
Origin: http://localhost
Pragma: no-cache
Cache-Control: no-cache

{}


Ответ:
Код: html
1.
2.
3.
4.
5.
6.
7.
HTTP/1.1 200 OK
Content-Length: 35
Content-Type: application/json; charset=utf-8
Server: Microsoft-HTTPAPI/2.0
Date: Fri, 20 Apr 2012 08:11:41 GMT

{"GetDataResult":"You entered: ee"}



Это дамп из firefox 11.
Обращение происходит в два этапа, сначала команда OPTION , так как кроссдоменный запрос, а потом уже сам POST запрос.
Собственно все возвращается, только вот jquery вываливает ошибку всегда.
...
Рейтинг: 0 / 0
Call Self-Hosting WCF Service from web-client javascript
    #37762695
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сам пример с wcf host и html страничкой.
...
Рейтинг: 0 / 0
Call Self-Hosting WCF Service from web-client javascript
    #37762783
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
даже взяв отсюда пример
->
и запустив я увидел что все как бы работает.
Только вот там хостинг на IIS.
и aspx страничка.

Я запустил хост из этой ссылки.
Потом запустил простую html страницу с кодом js, который был на aspx страничке. Не заработало. Тоже вываливается в обработчике error.

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
                    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
  <script src="jquery-latest.js"></script>
  
  <script>
     $(document).ready(function () {

$.ajax({
                      type: "GET",
                      url: "http://localhost:1415/MyService.svc/rh/data?id=4",
                      processData: false,
                      contentType: "application/json; charset=utf-8",
                      dataType: "json",
                      success: function (data) {
                          alert(data);
                      },
                      error: function (xhr, status, error) {
                          alert(error);

                      }

                 
              });

  });
</script>
  <style>img{ height: 100px; float: left; }</style>
</head>
<body>
 <div id="Container">
  <div id="RSSBlock">
    <div id="RSSContent" class="loading"></div>
  </div>
 
  <div id="Content">
    <p>Lorem ipsum dolor sit amet, consectetuer adipiscing...</p>
  </div>
</div>
 
</body>
</html>
...
Рейтинг: 0 / 0
Call Self-Hosting WCF Service from web-client javascript
    #37762970
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeiKответ уходящий на клиента вполне нормальный:
Код: sql
1.
2.
3.
4.
5.
6.
7.
HTTP/1.1 200 OK
Content-Length: 35
Content-Type: application/json; charset=utf-8
Server: Microsoft-HTTPAPI/2.0
Date: Wed, 18 Apr 2012 12:02:43 GMT

{"GetDataResult" :"You entered: ee"}


AlexeiK
Код: javascript
1.
$('#RSSContent').html(msg.d);
...
Рейтинг: 0 / 0
Call Self-Hosting WCF Service from web-client javascript
    #37763120
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Яростный Меч,

Не, это не повлияет.
Так как этот код из обработчика Success.
А тут он всегда на обработчик error выходит.

Я еще тут продвинулся на 1 шаг.
Приложил пример хоста и клиента.

В хосте я перешел на некий enableWebScript.
И теперь все мои запросы к хосту распознаются в firebug , он видит что пришел JSOn ответ и все теперь хорошо.
Но у скрипта все равно срабатывает error.

Код js:

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
$.ajax({
              
                      type: "GET",
                      url: "http://localhost:8733/GetData",
                      contentType: "application/json; charset=utf-8",
                      dataType: "jsonp",
                      success: function (data) {
                          alert("data");
                      },
                      error: function (xhr, status, error) {
                          alert("error");

                      }

                  });
...
Рейтинг: 0 / 0
Call Self-Hosting WCF Service from web-client javascript
    #37763126
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник

Вот картинка, где все заработало в firebug.
...
Рейтинг: 0 / 0
Call Self-Hosting WCF Service from web-client javascript
    #37763137
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Call Self-Hosting WCF Service from web-client javascript
    #37763437
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заработало.

->
тут помощь.

странно, я пытался реализовать, это с помощью файла конфигурации, но не получалось.
Только кодом создав службу и ее настройки, все получилось, как в том примере.
...
Рейтинг: 0 / 0
Call Self-Hosting WCF Service from web-client javascript
    #37763523
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeiK,

Решилось и с конфигурационным файлом.
Я не сделал настройку webhttpbinding.

<binding name="NewBinding0" crossDomainScriptAccessEnabled="true" />
вот эту.

если false, то ответ JSONP будет типа:
Код: html
1.
2.
3.
4.
5.
6.
7.
HTTP/1.1 200 OK
Content-Length: 59
Content-Type: application/json; charset=utf-8
Server: Microsoft-HTTPAPI/2.0
Date: Fri, 20 Apr 2012 12:26:01 GMT

{"d":{"__type":"Person:#wcfhost","Age":"34","Name":"werw"}}


если true:
Код: html
1.
2.
3.
4.
5.
6.
7.
HTTP/1.1 200 OK
Content-Length: 96
Content-Type: application/x-javascript
Server: Microsoft-HTTPAPI/2.0
Date: Fri, 20 Apr 2012 12:24:34 GMT

jQuery17203585929949582767_1334924674899({"__type":"Person:#wcfhost","Age":"34","Name":"werw"});



при условии что запрос вида:
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
GET http://localhost:8733/ajaxep/GetData?callback=jQuery17209671027506472333_1334924762133&_=1334924762194 HTTP/1.1
Host: localhost:8733
User-Agent: Mozilla/5.0 (Windows NT 6.0; rv:11.0) Gecko/20100101 Firefox/11.0
Accept: */*
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive
Referer: http://localhost/wcfa/htmlpage.htm
Cookie: hide_inactive_users=0; filter_users=



Собственно,
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
 <webHttpBinding>
        <binding name="NewBinding0" crossDomainScriptAccessEnabled="true" />
      </webHttpBinding>
<endpointBehaviors>
        <behavior name="NewBehavior0">
          <enableWebScript />
        </behavior>
      </endpointBehaviors>


Нужны для правильной работы с wcf и ajax.

Оба варианта приложил.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Call Self-Hosting WCF Service from web-client javascript
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]