代码之家  ›  专栏  ›  技术社区  ›  Paul Turner

如何控制服务方法的URI?

  •  0
  • Paul Turner  · 技术社区  · 14 年前

    我正试图创建一个wcf客户机来向CGI脚本发送XML消息。该脚本以请求-响应模式运行,其中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 回复  |  直到 14 年前
        1
  •  1
  •   marc_s HarisH Sharma    14 年前

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

    [WebGet(UriTemplate="/")]
    

    (如果使用的是get动词),或者

    [WebInvoke(UriTemplate="/", Method="POST")]
    

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

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

    查看msdn杂志文章 An Introduction To RESTful Services With WCF 为WCF和REST做一个很好的介绍。

        2
  •  0
  •   Paul Turner    14 年前

    最后,我想要达到的目标似乎并不简单,通过开箱即用的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-things”。