使用相同的合同托管多个端点,但在运行时进行修改

时间:2013-12-10 19:25:05

标签: .net wcf wcf-binding wcf-configuration

我在开发上停留了几天有点棘手。说明:

功能需求:公开一个具有不同绑定类型的唯一服务,它们在运行时共享相同的契约和开关,在客户端的功能中使用绑定(是.Net客户端,使用net.tcp - 如果是Java客户端,请使用http绑定)。

这就是我在配置文件中的内容:

  <!-- Test Service -->
  <service name="TestService.v1.TestServiceImplementation, TestService" behaviorConfiguration="MyBehavior">
        <endpoint name="TestServiceV1Htpp" contract="ITestService.v1" address="http://localhost:6001/TestService/v1" binding="basicHttpBinding"  bindingConfiguration="HttpConf" behaviorConfiguration="HttpSOAPBehavior"/>
        <endpoint name="TestServiceV1NetTcp" contract="ITestService.v1" address="net.tcp://localhost:6002/TestService/v1" binding="customBinding" bindingConfiguration="TcpConfStream" behaviorConfiguration="TcpSOAPBehavior"/>
  </service>

TestService dataContract

[ServiceContract(...)]
public interface ITestService : IDisposable
{
    [OperationContract]
    IEnumerable<string> GetData();
}

[ServiceBehavior(...)]
public class TestServiceImplementation : ITestService
{
     public IEnumerable<string> GetData()
    {
        yield return "Pong";
    }
}

我的“在运行时”合同的修改(在端点行为中,为了伪造有条件的返回结果):

public sealed class CustomBehavior : IEndpointBehavior
{
    void IEndpointBehavior.ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
    {
        foreach (var msg in endpoint.Contract.Operations.First().Messages)
        {
            var part = msg.Body.ReturnValue;
            if (part != null)
                part.Type = typeof(Stream);
        }           
    }
}

执行:

如果我不使用CustomBehavior,一切都很完美。当我将其添加到 TCP端点(TcpSOAPBehavior)的行为配置中时,Body.ReturnValue.Type被修改,此修改更改所有我的端点的所有合同(甚至http ...)。虽然我只是想修改TCP端点合约,但是没有触及HTTP ...有可能进行这样的修改吗?或者这些端点是为了永远共享相同的合同?

1 个答案:

答案 0 :(得分:0)

经过几天的工作,我找到了解决方案。我收到此错误消息:

“InnerException消息是'Type'System.Collections.Generic.List`1 [[System.String]]',数据协定名称为'ArrayOfValuationResult_testService_wsdl'不是预期的。将任何静态未知的类型添加到已知列表中types - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表。'。“

我在界面上使用了ServiceKnownTypeAttribute,就像在这个博客中一样:http://blogs.msdn.com/b/youssefm/archive/2009/04/21/understanding-known-types.aspx

通过这种方式,我能够公开一个IEnumerable,但是在Stream中对它进行转换并成功调用TCP / Http两个绑定。