我正在尝试创建一个WCF客户端,以将XML消息发送到CGI脚本。该脚本以请求 - 响应模式运行,其中XML消息的内容将决定要调用的操作。
我首先创建一个服务合同来表示CGI脚本将接受的已定义文档集:
[ServiceContract]
public interface ICgiService
{
[OperationContract(Name="request1")]
[WebInvoke(BodyStyle = WebMessageBodyStyle.Bare)]
ServiceResponse SubmitRequest(Request1 request);
[OperationContract(Name="request2")]
[WebInvoke(BodyStyle = WebMessageBodyStyle.Bare)]
ServiceResponse SubmitRequest(Request2 request);
[OperationContract(Name="request3")]
[WebInvoke(BodyStyle = WebMessageBodyStyle.Bare)]
ServiceResponse SubmitRequest(Request3 request);
}
我已从此接口生成代理客户端,并使用CGI脚本的地址配置端点并使用HTTP传输。
发出请求时,WCF运行时的默认行为是将操作名称附加到端点地址以生成URI http://server/script.cgi/request1
。
如何修改此行为,以便将所有请求发送到端点地址而不对URI进行任何更改(例如http://server/script.cgi
)?
答案 0 :(得分:1)
您需要为服务操作提供URI模板:
[WebGet(UriTemplate="/")]
(如果您使用的是GET动词)或
[WebInvoke(UriTemplate="/", Method="POST")]
(如果您使用的是POST动词)。
UriTemplate
可以是任何内容,并且它将附加到服务所在的基本URL。当您需要GET操作时,请使用[WebGet()]
属性 - 当您还需要其他任何内容时,请使用[WebInvoke(Method="....")]
属性并定义您需要的动词。
查看MSDN杂志文章An Introduction To RESTful Services With WCF,了解WCF和REST的精彩介绍。
答案 1 :(得分:0)
最后,通过开箱即用的WCF,我想要实现的目标似乎并不简单。
要实现对寻址的直接控制,可以实现IClientMessageFormatter
并直接设置To
标头值,但这是一个非常繁重的接口,可能会导致其他问题。
为了解决我的问题,我将服务合同重构为:
[ServiceContract]
public interface ICgiService
{
[OperationContract(Name="script.cgi")]
[WebInvoke(BodyStyle = WebMessageBodyStyle.Bare)]
ServiceResponse SubmitRequest(ServiceRequest request);
}
它不允许我将CGI脚本URL指定为完整端点地址,被视为REST服务,其中脚本是资源。
此外,ServiceRequest
类现在必须为每种类型的请求代表所有可能的XML结构,这使得服务合同更难理解。
可以说,这更接近现实世界的情况:将各种XML文档发布到单个CGI脚本,该脚本提供单个操作“Do Stuff”。