在使用 WCF 時,自訂訊息內容自然是免不了的設計。因此使用 DataContract, 已經是 WCF 中經典中的經典了。
如果需要 WCF client 多傳一些訊息回來,就必須在Service上更改 DataContract, 然後Client 再更新程式…..
等一下,DataContract 是一個 Contract,怎麼能說改就改?
話又說回來,面對各式各樣的客戶,常常見到不同的需求需要傳遞不同的訊息。此時該怎麼辦?
原來,WCF 內建有個傳遞訊息的方法,且不需要修改 DataContract。
步驟1:修改 WCF Client 的 config。
<client> <endpoint address="http://localhost:8081/test/service1.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService1" contract="ServiceReference1.IService1" name="BasicHttpBinding_IService1" > <!-- use header to pass message --> <headers> <MyHeader xmlns="http://sample.org/test"> This is my test data </MyHeader> </headers> </endpoint> </client>
步驟2: 修改 Service, 使用 OperationContext 讀取 header
int myHeaderIndex = OperationContext.Current.RequestContext.RequestMessage.Headers.FindHeader("MyHeader", "http://sample.org/test"); string result; if (myHeaderIndex != -1) { result = OperationContext.Current.RequestContext.RequestMessage.Headers.GetHeader(myHeaderIndex); } else result = OperationContext.Current.RequestContext.RequestMessage.Headers.Action; return string.Format("You entered: {0}, Header: {1}", value, result);
需要注意的是, Client config 中,可以傳不同的訊息,由 Service 來搜尋header。這樣一來,就不需要修改 DataContract 了。
當然,這樣也是有相當大的壞處,這樣會造成設計人員各自傳遞不同格式的訊息。假以時日,一堆不同的自訂訊息,最終難以維護。
沒有留言:
張貼留言