Как использовать службу wcf, работающую как служба windows в клиенте ajax - PullRequest
1 голос
/ 22 августа 2011

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

Теперь я хочу получить доступэтот сервис через клиент AJAX (то есть в проекте ASP.NET через компонент ScriptManager) и вызывать сервис по таймеру для получения непрерывного потока значений.

Я никогда не работал над AJAX или сетью так много, я этого не делалнайдите подходящий пример в сети.

Я использую WSHttpBinding.


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

Код библиотеки служб WCF:

Код ITestService.cs ....

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.ServiceModel.Web;

namespace TestServiceLibrary
{
    // NOTE: If you change the interface name "IService1" here, you must also update the reference to "IService1" in App.config.
    [ServiceContract(Namespace="TestServiceLibrary")]
    public interface ITestService
    {
        [OperationContract]
        [WebGet]
        double Add(double n1, double n2);

        // TODO: Add your service operations here
    }
}

Код TestService.cs ...............

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace TestServiceLibrary
{
    // NOTE: If you change the class name "Service1" here, you must also update the reference to "Service1" in App.config.
    public class TestService : ITestService
    {
        public double Add(double n1, double n2)
        {
            return n1 + n2;
        }
    }
}

TestServiceHost.cs (код консольного приложения)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using TestServiceLibrary;

namespace TestServiceHost
{
    class Program
    {
        static void Main(string[] args)
        {
            ServiceHost myhost = new ServiceHost(typeof(TestService));

            myhost.Open();

            while (System.Console.ReadKey().Key != System.ConsoleKey.Enter)
            {
                //System.Threading.Thread.Sleep(100);
            }

            myhost.Close();
        }
    }
}

XML-конфигурация app.config ... одинакова как в библиотеке служб wcf, так и в хосте службы wcf (консольное приложение).в данном случае ..)

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.web>
    <compilation debug="true" />
  </system.web>
  <!-- When deploying the service library project, the content of the config file must be added to the host's 
  app.config file. System.Configuration does not support config files for libraries. -->
  <system.serviceModel>
    <services>
      <service name="TestServiceLibrary.TestService" behaviorConfiguration="TestServiceLibrary.Service1Behavior">
        <host>
          <baseAddresses>
            <add baseAddress = "http://localhost:8731/TestServiceLibrary/TestService/" />
          </baseAddresses>
        </host>
        <!-- Service Endpoints -->
        <!-- Unless fully qualified, address is relative to base address supplied above -->
        <endpoint name="TestService_wsHttpBinding" address ="" binding="wsHttpBinding" contract="TestServiceLibrary.ITestService">
          <!-- 
              Upon deployment, the following identity element should be removed or replaced to reflect the 
              identity under which the deployed service runs.  If removed, WCF will infer an appropriate identity 
              automatically.
          -->
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <!-- Metadata Endpoints -->
        <!-- The Metadata Exchange endpoint is used by the service to describe itself to clients. --> 
        <!-- This endpoint does not use a secure binding and should be secured or removed before deployment -->
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="TestServiceLibrary.Service1Behavior">
          <!-- To avoid disclosing metadata information, 
          set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="True"/>
          <!-- To receive exception details in faults for debugging purposes, 
          set the value below to true.  Set to false before deployment 
          to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

Веб-клиент (клиент asp.net, default.aspx) код ...

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Simple AJAX Service Client Page</title>

    <script type="text/javascript">
    // <![CDATA[

    // This function creates an asynchronous call to the service
    function makeCall(operation){
        var n1 = document.getElementById("num1").value;
        var n2 = document.getElementById("num2").value;

        // If user filled out these fields, call the service
        if(n1 && n2){

            // Instantiate a service proxy
            var proxy = new TestServiceLibrary.ITestService();

            // Call correct operation on proxy       
            switch(operation){
                case "Add":
                    proxy.Add(parseFloat(n1), parseFloat(n2), onSuccess, onFail, null);            
                break;

            }
        }
    }

    // This function is called when the result from the service call is received
    function onSuccess(mathResult){
        document.getElementById("result").value = mathResult;
    }

    // This function is called if the service call fails
    function onFail(){
        document.getElementById("result").value = "Error";
    }

    // ]]>
    </script>

</head>
<body>
    <h1>
        Simple AJAX Service Client Page</h1>
    <p>
        First Number:
        <input type="text" id="num1" /></p>
    <p>
        Second Number:
        <input type="text" id="num2" /></p>
    <input id="btnAdd" type="button" onclick="return makeCall('Add');" value="Add" />
    <p>
        Result:
        <input type="text" id="result" /></p>
    <form id="mathForm" action="" runat="server">
    <asp:ScriptManager ID="ScriptManager" runat="server">
        <Services>
            <asp:ServiceReference Path="http://localhost:8732/TestServiceLibrary/TestService/" />
        </Services>
    </asp:ScriptManager>
    </form>
</body>
</html>

Ошибка, которую я получаю при доступе к веб-сервису через asp.net в ajax: Ошибка времени выполнения Microsoft JScript: 'TestServiceLibrary' не определен

Пожалуйста, пройдите этот код и помогите мне найти проблему.Спасибо всем за ваши ответы.

Ответы [ 3 ]

2 голосов
/ 23 августа 2011

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

Я должен изменить мой сервисный хостинг в консольном приложении, чтобы использовать WebServiceHost вместо ServiceHost, тогда говорить могут только клиенты ajaxк моей службе.Вместо wsHttpBinding я должен использовать webHttpBinding.

Итак, код для webHosting выглядит следующим образом.

using (var host = new WebServiceHost(
  typeof(TestService)))
{
    // Start listening for messages
    host.Open();

    Console.WriteLine("Press any key to stop the service.");
    Console.ReadKey();

    // Close the service
    host.Close();
}

Конфигурация xml моей консоли:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <services>
      <service
          name="TestServiceLibrary.TestService"
          behaviorConfiguration="">
        <endpoint address="http://localhost:8732/TestService"
           binding="webHttpBinding"
           bindingConfiguration=""
           name="TestService_WebHttp"
           contract="TestServiceLibrary.ITestService" />
      </service>
    </services>
  </system.serviceModel>
</configuration>

Теперькогда я внес эти изменения, я могу вызывать свой сервис через, т. е. используя следующий URL-адрес, т.е. http://localhost:8732/TestService/Add?n1=20&n2=20, и результат, возвращаемый им, выглядит следующим образом <double xmlns="http://schemas.microsoft.com/2003/10/Serialization/">40</double>

Наконец я нашел решение своей проблемы.Я использую JSON как способ передачи данных, а скрипт для получения данных выглядит следующим образом:

<script type="text/javascript">
    $("#mybutton").click(function () {


        $.getJSON("http://localhost:8732/TestService/Add", null, function (result) {


        });

    });     
</script>
0 голосов
/ 22 августа 2011

Вы уже пытались подключиться к сервису через клиент AJAX? Если это так, вы получаете какие-либо ошибки?

Не видя код, может быть несколько вещей, как сказал Чандермани.

Я не делал AJAX с WCF, но, просматривая статью, рекомендованную Преетом, я бы посоветовал проверить (если вы этого еще не сделали), что ваш AJAX-клиент имеет необходимый код согласно статье.

Оформлены ли ваши сервисные операции с помощью [WebGet]?

Правильно ли настроен файл конфигурации для клиента AJAX? Правильно ли настроен файл конфигурации службы?

0 голосов
/ 22 августа 2011

Используйте какой-нибудь инструмент, например firebug, чтобы определить, что происходит с запросом. WSHttpBinding является безопасным по умолчанию. Проверьте настройки безопасности. Попробуйте сначала без защиты, чтобы убедиться, что это не проблема безопасности.

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