gpt4 book ai didi

带有内容转换的 WCF 路由

转载 作者:行者123 更新时间:2023-12-04 05:16:15 27 4
gpt4 key购买 nike

我已经实现了 WCF 路由服务;我还希望该服务(或类似的 WCF 服务)以规定的和统一的(与内容无关的)方式转换有效负载。例如,有效负载将始终采用 Foo<T> 的形式。我想把它作为Bar<T>在所有情况下。我很高兴转换为 XSLT 或程序化。我不在乎收到的不是 Foo<T> 类型的消息会发生什么情况.

我希望使用 WCF,因为它提供了很多 OOTB 功能(例如,它支持大量绑定(bind))。使用许多样板方法来实现 WCF 服务来转换每个封闭的泛型( Foo<Class1> -> Bar<Class1> ; Foo<Class2> -> Bar<Class2> ; 等)是不切实际的,因为这将需要每次重新编译/重新部署新的消息类型将被路由。

据我所知,WCF 不处理开放泛型,并且 WCF 路由不促进内容转换 OOTB。也就是说,System.ServiceModel.Routing.RoutingService显然以某种非特定形式拦截 WCF 调用,所以我希望利用相同的模式来实现我的目标。谁能提供有关如何执行此操作的指导(或说明为什么不可能)?

最佳答案

正如我在对该问题的评论中所建议的那样,使用 IDispatchMessageInspector 可以解决此问题。请在下面找到我最终编写的极其简化的版本(比我发布 20 个类(class)的代码更容易)。如果有人想要一个完整的解决方案以更清晰、更高级的方式实现此代码,请告诉我,我会将我的演示放在 CodeProject 上。现在,我假设你对一小部分胆量感到满意。

控制台命令显然可以删除(如果您是自托管的,它们只是为了调试)。

    public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
if (request == null || request.IsEmpty)
return null;

Console.WriteLine();
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine(request);
Console.ResetColor();

// Load the request into a document.
XPathDocument document;
MemoryStream stream;
using (stream = new MemoryStream())
{
using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(stream))
{
request.WriteMessage(writer);
writer.Flush();
stream.Position = 0L;
document = new XPathDocument(stream);
}
}

// Load the XSLT.
XslCompiledTransform transformer = new XslCompiledTransform();
transformer.Load("RequestTransformation.xslt");

// Transform the document.
byte[] transformedDocument;
using (stream = new MemoryStream())
{
transformer.Transform(document, null, stream);
transformedDocument = stream.ToArray();
}

// Construct new request from tranformed document.
stream = new MemoryStream(transformedDocument);
XmlReader reader = XmlReader.Create(stream);
Message modifiedMessage = Message.CreateMessage(reader, int.MaxValue, request.Version);
modifiedMessage.Properties.CopyProperties(request.Properties);
request = modifiedMessage;

Console.WriteLine();
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine(new System.Text.UTF8Encoding(false).GetString(transformedDocument));
Console.ResetColor();

return null;
}

关于带有内容转换的 WCF 路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14229219/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com