在运行时创建WCF服务
我们将根据运行时读取的元数据构建一个 Web 服务。我指的是整个网络服务:签名、合同和实施。
从这里我看到有两条主要路径。
第一条路径是生成代码。您可以在字符串中生成 C# 代码并即时编译它,或者更优雅(且复杂)地发出 MSIL 代码。这样您就拥有了 WCF 代码,并且 WCF 将负责从它生成 WSDL。
第二条途径是使用通用服务。具有接受所有内容的操作消息进程(消息)的服务。我们仍然希望将服务公开为“正常”服务,因此我需要在某个地方使用 WSDL。如何创建 WSDL?我考虑过使用 System.ServiceModel.Description,直到我意识到在内心深处,这个 API 依赖于具体类型。通过这种方法,我们不会有任何数据协定类型,并且可以动态处理 XML,使用元数据来解释它。因此我们需要以某种方式生成 WSDL。这是一个疯狂的想法吗? WSDL 有相当复杂的规范...
第三种选择是使用混合方法,发出类型只是为了创建签名,但使用非发出的代码(反映发出的类型)来实现服务。很奇怪,但可能比手工制作 WSDL 更简单...
有建议吗?
We are going to build a web service from metadata read at runtime. I mean the entire web service: the signatures, contracts and implementation.
There are two main paths I see from here.
The first path is that you generate code. Either you generate C# code in strings and compile it on the fly or more elegantly (and complicatedly), you emit MSIL code. This way you have WCF code and WCF will take care of generating the WSDL from it.
The second path is to use a generic service. A service with an operation Message Process(Message) accepting everything. We still want to expose the service as a 'normal' service, so I would need a WSDL somewhere. How can I create a WSDL? I thought about using System.ServiceModel.Description until I realised that deep inside, this API depends on concrete types. With this approach we wouldn't have any data contract type and would process XML on the fly, using metadata to interpret it. So we need somehow to generate the WSDL. Is that a crazy idea? WSDL has quite a complicated spec...
A third option would be to use an hybrid approach, emitting types just to create signatures but implementing the service using non-emitted code (reflecting on emitted types). Weird, but might be simpler than hand crafting WSDL by hand...
Suggestions?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
做起来很痛苦,但对于发射类型来说是可能的。创建您的 .svc 并将其指向您的自定义 ServiceHostFactory:
您的 ServiceHostFactory 是您生成操作合同、随之而来的类型等的地方:
}
在 ServiceHostFactory 中,您定义行为以及元数据,因此您的行为需要实现 IOperationBehavior 和 IOperationInvoker (或者您可以单独实现它们),并且看起来像这样:
对于
复杂类型,这是您需要做出判断的地方调用是您问题的根源,是如何发出类型。这是一个示例,但您可以按照您认为合适的任何方式进行操作。我在我的 ServiceHostFactory 中调用它(警告:它是演示代码)
更新:我编写了一个快速示例,它可用 这里。
It's a pain to do, but possible to emitting types. Create your .svc and point it at your custom ServiceHostFactory:
Your ServiceHostFactory is where you generate your operation contracts, types that go with it, etc:
}
In the ServiceHostFactory you define the behaviors along with the metadata, so your behavior would need to implement IOperationBehavior and IOperationInvoker (or you could implement them separately) and look something like this:
}
For complex types, this is where you need to make a judgement call, which is the root of your question, is how to emit the types. Here's an example, but you can do it any way you can see fit. I'm calling this in my ServiceHostFactory (warning: it's demo code)
update: I wrote a quick example and it is available here.