2009年2月9日 星期一

WCF: 使用 Header 傳遞訊息

在使用 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 了。
當然,這樣也是有相當大的壞處,這樣會造成設計人員各自傳遞不同格式的訊息。假以時日,一堆不同的自訂訊息,最終難以維護。

sample download

沒有留言:

Share with Facebook