如何控制服务方法的URI?

时间:2010-07-16 14:00:10

标签: .net wcf ws-addressing

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

2 个答案:

答案 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”。