Использовать внешний сервис WCF, используя фабрику каналов, а не через прокси или добавляя ссылку на сервис - PullRequest
0 голосов
/ 23 ноября 2018

Я хотел бы знать, есть ли возможность использовать внешний сервис wcf (под внешним сервисом wcf я имею в виду сервис, который не является частью моего решения) с использованием фабрики каналов.Я знаю, что мы можем потреблять, генерируя прокси или добавляя ссылку на сервис, но я хочу знать, можем ли мы использовать фабрику каналов.Поскольку это внешний сервис, у нас не будет класса интерфейса с использованием, поэтому нам нужно знать, как будет выглядеть экземпляр фабрики каналов?

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Вы должны знать формат интерфейса контракта на обслуживание и конечной точки, иначе мы не смогли создать фабрику каналов.Причина, по которой фабрика каналов используется для вызова службы, заключается в том, что для защиты службы WCF на стороне сервера отключают метаданные службы публикации.Я сделал простую демонстрацию, желаю, чтобы она была вам полезна.
На стороне сервера.

class Program
{
static void Main(string[] args)
{
Uri uri = new Uri("http://localhost:1900");
BasicHttpBinding binding = new BasicHttpBinding();
using (ServiceHost sh=new ServiceHost(typeof(MyService),uri))
{
sh.AddServiceEndpoint(typeof(IService), binding, "");
sh.Open();
Console.WriteLine("Service is ready...");

Console.ReadLine();
sh.Close();
}

}
}
[ServiceContract(Namespace ="mydomain")]
public interface IService
{
[OperationContract(Name ="AddInt")]
int Add1(int x, int y);

}
public class MyService : IService
{
public int Add(int x, int y)
{
return x + y;
}
}

На стороне клиента.

class Program
{
static void Main(string[] args)
{
Uri uri = new Uri("http://localhost:1900");
BasicHttpBinding binding = new BasicHttpBinding();
using (ChannelFactory<IService> factory = new ChannelFactory<IService>(binding, new EndpointAddress(uri)))
{
IService sv = factory.CreateChannel();
var result = sv.Add(34, 3);
try
{
Console.WriteLine(result);
}
catch (Exception ex)
{
throw;
}
}
}
}
[ServiceContract(Namespace = "mydomain")]
public interface IService
{
[OperationContract(Name = "AddInt")]
int Add2(int x, int y);
}

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

0 голосов
/ 23 ноября 2018

Вам нужно будет имитировать интерфейс службы, посмотрев на файл WSDL (файл метаданных службы)

Затем вы можете использовать несколько вспомогательных методов для инициализации службы,

public static TChannel GetBasicHttpService<TChannel>(string serviceEndpoint) where TChannel : class
    {
        EndpointAddress myEndpoint = new EndpointAddress(serviceEndpoint);
        ChannelFactory<TChannel> myChannelFactory = new ChannelFactory<TChannel>(DefaultHttpBinding(), myEndpoint);

        // Create a channel.
        return myChannelFactory.CreateChannel();
    }

    public static BasicHttpBinding DefaultHttpBinding()
    {
        BasicHttpBinding defaultBinding = new BasicHttpBinding();
        defaultBinding.MaxReceivedMessageSize = 2147483647;
        defaultBinding.MaxBufferPoolSize = 2147483647;
        defaultBinding.MaxBufferSize = 2147483647;
        defaultBinding.ReaderQuotas.MaxArrayLength = 2147483647;
        defaultBinding.ReaderQuotas.MaxStringContentLength = 2147483647;

        return defaultBinding;
    }

где TChannel - это интерфейс Mimicked

...