1

我被困在一个有点棘手的开发上几天。解释:

功能需求:公开具有不同绑定类型的独特服务,这些服务共享相同的合约,并在运行时切换在客户端功能中使用哪个绑定(是.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>

测试服务数据合同

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

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

以及我的“运行时”合同的修改(在端点行为中,为了伪造一个 stremed 返回结果):

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 合同……是否可以进行这样的修改?或者这些端点旨在永远共享同一个合同?

4

1 回答 1

0

经过几天的工作,我找到了解决方案。我有这个错误信息:

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

我在此博客中的界面上使用了 ServiceKnownTypeAttribute:http: //blogs.msdn.com/b/youssefm/archive/2009/04/21/understanding-known-types.aspx

通过这种方式,我可以公开一个 IEnumerable 但在 Stream 中转换它,并通过 TCP/Http 绑定成功调用。

于 2013-12-18T15:50:51.277 回答