.net 如何控制服务方法的URI?

.net 如何控制服务方法的URI?,.net,wcf,ws-addressing,.net,Wcf,Ws Addressing,我正在尝试创建一个WCF客户端,以便将XML消息发送到CGI脚本。该脚本以请求-响应模式运行,其中XML消息的内容将决定要调用的操作 首先,我创建了一个服务契约来表示CGI脚本将接受的已定义文档集: [ServiceContract] public interface ICgiService { [OperationContract(Name="request1")] [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare)] Se

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

您需要为服务操作提供URI模板:

[WebGet(UriTemplate="/")]
(如果您使用的是GET动词),或者

(如果你用的是后置动词)

UriTemplate
可以是任何内容,它将附加到服务所在的基本URL。当您需要GET操作时,请使用
[WebGet()]
属性-当您需要其他操作时,请使用
[WebInvoke(Method=“…”)]
属性并定义您需要的动词


查看MSDN杂志文章,了解WCF和REST的精彩介绍。

最后,我想通过开箱即用的WCF实现的目标似乎并不简单

要实现对寻址的直接控制,可以实现一个并直接设置头值,但这是一个非常繁重的接口,可能会导致其他问题

为了解决我的问题,我将服务合同重构为:

[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”。

UriTemplate=“/”
仍然通过添加“/”来修改地址。除了原始端点URI之外的任何请求都将返回404。是的,这是我之前尝试的工作之一。我记不起确切的行为;我收到一个异常,或者它使用了操作名。@Programming Hero:或者您可以将*.svc文件在虚拟目录的层次结构中上移一级,然后使用
UriTemplate=“script.cgi”
??您可能无法在三个不同的操作上使用该示例模板,不过……这实际上是我要解决的问题,因此“操作”成为CGI脚本,端点是脚本的路径。这并不理想,因为它在应用程序源代码中将URI的一部分“硬编码”到CGI脚本。
[ServiceContract]
public interface ICgiService
{
    [OperationContract(Name="script.cgi")]
    [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare)]
    ServiceResponse SubmitRequest(ServiceRequest request);
}