使用通道工厂而不是使用代理或添加服务引用来消耗外部WCF服务

时间:2018-11-23 12:24:50

标签: wcf wcf-data-services wcf-binding

我想知道是否有可能使用通道工厂使用外部wcf服务(通过外部wcf服务,我的服务不属于我的解决方案)。我知道我们可以通过生成代理或添加服务引用来进行消费,但我想知道是否可以使用通道工厂。由于它是一项外部服务,我们将无法使用该接口类,因此需要知道通道工厂实例的外观如何?

2 个答案:

答案 0 :(得分:0)

您需要通过查看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是模仿的接口

答案 1 :(得分:0)

您应该知道服务合同接口和端点的格式,否则我们将无法创建渠道工厂。使用通道工厂调用服务的原因是,为了保护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);
}

不需要确保客户端和服务器具有相同的服务接口,但是它们至少需要确保客户端和服务器之间接口的名称空间和名称属性是一致的。 随时让我知道是否有什么可以帮助您的。