0

我正在尝试创建一个 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)?

4

2 回答 2

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 的精彩介绍。

于 2010-07-17T06:49:39.143 回答
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 文档发布到提供单个操作“Do Stuff”的单个 CGI 脚本中。

于 2010-07-21T16:44:15.553 回答