использование службы WCF с использованием простого класса HttpClient - PullRequest
0 голосов
/ 28 декабря 2018

Рассмотрим пример, который есть у Microsoft: https://docs.microsoft.com/en-us/dotnet/framework/wcf/how-to-create-a-wcf-client

Как можно использовать сервер, используя простой объект HttpClient?

Есть случаи, когда добавление веб-ссылки в ваш проект невозможный.Затем, использование объекта HttpClient может быть единственным способом ... или добавление ссылки DLL сервера на стороне клиента также может быть вариантом.

Это должен быть простой пример того, как вызывать простую функцию double = Add (double, double), описанную в:

namespace GettingStartedLib
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together.
    [ServiceContract]
    public interface ICalculator
    {
        [OperationContract]
        double Add(double n1, double n2);
    }
}

Сторона сервера выглядит следующим образом:

namespace GettingStartedLib
{
    public class CalculatorService : ICalculator
    {
        public double Add(double n1, double n2)
        {
            double result = n1 + n2;
            Console.WriteLine("Received Add({0},{1})", n1, n2);
            // Code added to write output to the console window.
            Console.WriteLine("Return: {0}", result);
            return result;
        }
    }
}

1 Ответ

0 голосов
/ 31 декабря 2018

Вы можете использовать HTTP-клиент для отправки http-запроса, ссылаясь на содержимое запроса, захваченное Fiddle.

POST http://10.157.18.36:12000/Service1.svc HTTP/1.1 Content-Type: text/xml; charset=utf-8 SOAPAction: "http://tempuri.org/IService1/Add" Host: 10.157.18.36:12000 Content-Length: 161 Expect: 100-continue Accept-Encoding: gzip, deflate Connection: Keep-Alive

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><Add xmlns="http://tempuri.org/"><n1>34.23</n1><n2>80.54</n2></Add></s:Body></s:Envelope>

Служба WCF на основе спецификации веб-службы.
https://en.wikipedia.org/wiki/Web_service
Онииспользуйте мыльное сообщение, чтобы общаться друг с другом через протокол http / https.В этом случае мы могли бы использовать httpclient для имитации запроса.
Кроме того, wcf также мог бы публиковать сервис через http-режим, как веб-API Asp.net, структура стиля restful.
https://docs.microsoft.com/en-us/dotnet/framework/wcf/wcf-and-aspnet-web-api
Я сделал демо, желаю, чтобы это было полезно для вас.
IService1

[ServiceContract]
    public interface IService1
    {

        [OperationContract]
        [WebGet(ResponseFormat =WebMessageFormat.Json,RequestFormat =WebMessageFormat.Json)]
        Double Add(double n1, double n2);

}

Service1.svc.cs

    public class Service1 : IService1
    {
        public double Add(double n1, double n2)
        {
            return n1 + n2;
        }
}

Конфигурация.

<system.serviceModel>
    <services>
      <service name="WcfService1.Service1">
        <endpoint address="" binding="webHttpBinding" contract="WcfService1.IService1" behaviorConfiguration="rest"></endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint>
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="rest">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" httpGetUrl="mex"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
        <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

Клиент.

static void Main(string[] args)
        {
            HttpClient client = new HttpClient();
            var  result=client.GetStringAsync("http://localhost:9001/Service1.svc/add?n1=1.2&n2=3.2");
            Console.WriteLine(result.Result);

        }

Результат.
enter image description here
Не стесняйтесь, дайте мне знать, если есть что-то, с чем я могу помочь.

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