将REST路由到WCF中的命名管道

时间:2009-06-03 14:49:38

标签: wcf rest

我想将REST(WebHttp)的请求路由到另一个服务。其他服务将通过命名管道 REST进行侦听。路由器是一个简单的服务,它将所有请求作为消息,将它们路由到目标并将目标的答案发送回客户端。

1)当我尝试将REST路由到命名管道时,存在信封问题:REST没有信封,命名管道有SOAP。在REST中,reqest数据在url中编码,而在命名管道中,它在SOAP主体中编码。

2)当我尝试将REST路由到REST时,reqest被路由到服务,回复到达路由器并发送,但我在客户端收到“请求错误”。

如何在此szenario中完成路由?

2 个答案:

答案 0 :(得分:1)

为了帮助您完成场景的第一部分,我必须更多地了解您可能遇到的设计限制。您可能尝试了几种不同的方法,因此尚不清楚从哪里开始。我可以说,当我们建立类似的“调度”服务时,我们使用的方法是实现最一般的合同,如下所示:

[ServiceContract(Name = "SOADispatchService", Namespace = "<your namespace>")]
public interface ISOADispatchService
{
    [OperationContract(Action="*", ReplyAction="*")]
    Message ProcessMessage(Message requestMessage);
}

[ServiceBehavior(AddressFilterMode=AddressFilterMode.Any)]
public class SOADispatchService : RefCountedBaseHandler, ISOADispatchService
{
    Message ProcessMessage(Message requestMessage)
    {
         dispatching code here
    }
}

这使您可以直接访问原始消息表单中的请求和响应,并允许您确定请求的类型并精确控制响应的结构和格式。在我们的例子中,调度程序接受SOAP和HTTP GET(也称为REST)请求,并且必须返回SOAP响应或REST响应(XML,JSON,HTML中的任何一个)。这需要更多地了解WCF如何格式化其消息以及消息结构与调度程序绑定之间的交互,但它会尽可能多地为您提供控制。

在诊断您的第二个问题方面,再次不确定配置片段究竟是什么问题,可能是很多事情。我们发现在诊断类似问题时非常有价值的两个工具是WCF服务跟踪工具和WCF反编译器。跟踪工具是visual studio包的一部分。要启用它,请添加以下配置:

<system.diagnostics >
    <sharedListeners>
      <add name="sharedListener"
           type="System.Diagnostics.XmlWriterTraceListener"
           initializeData="c:\traces\WCFTrace.svclog" />
    </sharedListeners>
    <sources>
      <source name="System.ServiceModel" switchValue="All, Verbose, ActivityTracing" >
        <listeners>
          <add name="sharedListener" />
        </listeners>
      </source>
      <source name="System.ServiceModel.MessageLogging" switchValue="All">
        <listeners>
          <add name="sharedListener" />
        </listeners>
      </source>
    </sources>   </system.diagnostics>

这为您提供了一个跟踪文件(在指定位置),您可以使用SvcTraceViewer.exe读取该文件。它显示了交易的所有细节,并且可以提供有关WCF期望您不做的事情的线索。反编译器很有用,因为有时候为了理解为什么某些东西是必需的,你只需要看看代码是什么。 WCF只有大约一百万个扩展选项(这只是一个轻微的扩展),因此弄清楚它们如何在没有代码访问的情况下进行交互可能会令人抓狂。

我希望这有助于指明你正确的方向。如果您可以提供一些代码示例,我们可以为您提供更多指导性建议。

答案 1 :(得分:1)

您是否需要在场景中使用路由?

您是否可以将一个服务作为两个端点发布。 REST和namedpipes端点?两个端点都将执行相同的代码,客户端可以选择他们希望使用的端点。