您可以手工制作一个支持 WebService 上可用方法子集的接口,而无需生成服务引用。
您必须为包括 dto 和命名空间在内的方法创建正确的肥皂签名。这样做的缺点是您将被迫手动管理对服务的任何更改。
这是一个简单的示例,它显示了一个代理客户端,它ISubsetInterface
通过与公开IServiceInterface
. 为此,Name 属性必须与 IServiceInterface 协定的名称相匹配,在这种情况下默认为“IServiceInterface”,但您的实现可能需要对命名空间和操作进行操作。了解您需要操作什么的最简单方法是查看生成的 wsdl。
[TestFixture]
public class When_using_a_subset_of_a_WCF_interface
{
[Test]
public void Should_call_interesting_method()
{
var serviceHost = new ServiceHost(typeof(Service));
serviceHost.AddServiceEndpoint( typeof(IServiceInterface), new BasicHttpBinding(), "http://localhost:8081/Service" );
serviceHost.Description.Behaviors.Find<ServiceDebugBehavior>().IncludeExceptionDetailInFaults = true;
serviceHost.Open();
using( var channelFactory = new ChannelFactory<ISubsetInterface>( new BasicHttpBinding(), "http://localhost:8081/Service") )
{
var client = channelFactory.CreateChannel();
client.InterestingMethod().Should().Be( "foo" );
}
serviceHost.Close();
}
[ServiceContract]
interface IServiceInterface
{
[OperationContract]
string InterestingMethod();
[OperationContract]
string UninterestingMethod();
}
[ServiceContract(Name = "IServiceInterface")]
interface ISubsetInterface
{
[OperationContract]
string InterestingMethod();
}
class Service : IServiceInterface
{
public string InterestingMethod() { return "foo"; }
public string UninterestingMethod() { throw new NotImplementedException(); }
}
}