2010-07-16 22 views
0

我正在嘗試創建一個WCF客戶端以將XML消息發送到CGI腳本。該腳本以請求 - 響應模式運行,其中XML消息的內容將確定要調用的操作。如何控制服務方法的URI?

我已經通過創建一個服務合同,代表定義的一組文件啓動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

最終,我想通過現成的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」。

1

您需要提供一個URI模板爲您服務操作:

[WebGet(UriTemplate="/")] 

(如果您使用的是GET動詞),或

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

(如果您使用的是POST動詞)。

UriTemplate可以是任何東西,它會被追加到服務所在的基本URL。當您需要GET操作時,請使用[WebGet()]屬性 - 當您需要任何其他內容時,請使用[WebInvoke(Method="....")]屬性並定義您需要的動詞。

查看MSDN Magazine文章An Introduction To RESTful Services With WCF,瞭解WCF和REST的一個很好的介紹。

+0

'UriTemplate =「/」'仍然通過追加「/」來修改地址。除原始端點URI之外的任何請求都會返回404。 – 2010-07-17 07:06:34

+0

@編程英雄:你有沒有試過'UriTemplate =「」'? – 2010-07-17 07:26:07

+0

是的,作爲我之前嘗試做這項工作的一個嘗試。我不記得確切的行爲;我收到了一個異常,或者它使用了操作名稱。 – 2010-07-17 07:28:19

相關問題