2011-08-10 21 views
9

對於webHttpBinding和helpEnabled =「true」的服務,幫助信息已正確生成。想知道是否有可能以某種方式控制輸出。以下是我想要做的更改。在WCF中自定義WebHttp幫助輸出

  1. 刪除JSON幫助,因爲該服務不支持JSON輸出。有可能讓用戶感到困惑。至少,有辦法輸出一個說明JSON不被支持。
  2. 對於顯示的示例回覆,使用比「字符串內容」更好的示例,其中可以指定實際值樣本。如果我可以提供用於序列化的對象作爲示例,那將會很好。

回答

5

無法自定義WCF WebHttp端點的幫助頁面。但是,您可以將其替換爲您自己的自定義頁面。這很容易實現,但是需要編寫很多代碼。下面的例子顯示瞭如何完成一個簡單的服務。

public class StackOverflow_7005187 
{ 
    [DataContract] 
    public class MyDC 
    { 
     [DataMember] 
     public string str = "The string"; 
    } 
    [ServiceContract] 
    public interface ITest 
    { 
     [WebInvoke] 
     string EchoString(string text); 
     [WebGet] 
     int Add(int x, int y); 
     [WebInvoke] 
     MyDC EchoDC(MyDC input); 
     [WebGet(UriTemplate = "/help")] 
     Message GetMainHelpPage(); 
     [WebGet(UriTemplate = "/help/operations/EchoDC")] 
     Message GetOperationsEchoDCHelpPage(); 
     // help for other operations not implemented 
    } 
    public class Service : ITest 
    { 
     public string EchoString(string text) 
     { 
      return text; 
     } 

     public int Add(int x, int y) 
     { 
      return x + y; 
     } 

     public MyDC EchoDC(MyDC input) 
     { 
      return input; 
     } 

     public Message GetMainHelpPage() 
     { 
      string page = @"<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Transitional//EN"" ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd""> 
<html xmlns=""http://www.w3.org/1999/xhtml""> 
    <head> 
    <title>Operations at http://localhost:8000/Service</title> 
    <style>BODY { color: #000000; background-color: white; font-family: Verdana; margin-left: 0px; margin-top: 0px; } #content { margin-left: 30px; font-size: .70em; padding-bottom: 2em; } A:link { color: #336699; font-weight: bold; text-decoration: underline; } A:visited { color: #6699cc; font-weight: bold; text-decoration: underline; } A:active { color: #336699; font-weight: bold; text-decoration: underline; } .heading1 { background-color: #003366; border-bottom: #336699 6px solid; color: #ffffff; font-family: Tahoma; font-size: 26px; font-weight: normal;margin: 0em 0em 10px -20px; padding-bottom: 8px; padding-left: 30px;padding-top: 16px;} pre { font-size:small; background-color: #e5e5cc; padding: 5px; font-family: Courier New; margin-top: 0px; border: 1px #f0f0e0 solid; white-space: pre-wrap; white-space: -pre-wrap; word-wrap: break-word; } table { border-collapse: collapse; border-spacing: 0px; font-family: Verdana;} table th { border-right: 2px white solid; border-bottom: 2px white solid; font-weight: bold; background-color: #cecf9c;} table td { border-right: 2px white solid; border-bottom: 2px white solid; background-color: #e5e5cc;}</style> 
    </head> 
    <body> 
    <div id=""content""> 
     <p class=""heading1"">Operations at http://localhost:8000/Service</p> 
     <p>This page describes the service operations at this endpoint.</p> 
     <table> 
     <tr> 
      <th>Uri</th> 
      <th>Method</th> 
      <th>Description</th> 
     </tr> 
     <tr> 
      <td>Add</td> 
      <td title=""http://localhost:8000/Service/Add?x={X}&amp;y={Y}""> 
      <a rel=""operation"" href=""help/operations/Add"">GET</a> 
      </td> 
      <td>Service at http://localhost:8000/Service/Add?x={X}&amp;y={Y}</td> 
     </tr> 
     <tr> 
      <td>EchoDC</td> 
      <td title=""http://localhost:8000/Service/EchoDC""> 
      <a rel=""operation"" href=""help/operations/EchoDC"">POST</a> 
      </td> 
      <td>Service at http://localhost:8000/Service/EchoDC</td> 
     </tr> 
     <tr> 
      <td>EchoString</td> 
      <td title=""http://localhost:8000/Service/EchoString""> 
      <a rel=""operation"" href=""help/operations/EchoString"">POST</a> 
      </td> 
      <td>Service at http://localhost:8000/Service/EchoString</td> 
     </tr> 
     </table> 
    </div> 
    </body> 
</html>"; 
      return WebOperationContext.Current.CreateStreamResponse(
       new MemoryStream(Encoding.UTF8.GetBytes(page)), 
       "text/html"); 
     } 


     public Message GetOperationsEchoDCHelpPage() 
     { 
      string page = @"<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Transitional//EN"" ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd""> 
<html xmlns=""http://www.w3.org/1999/xhtml""> 
    <head> 
    <title>Reference for http://localhost:8000/Service/EchoDC</title> 
    <style>BODY { color: #000000; background-color: white; font-family: Verdana; margin-left: 0px; margin-top: 0px; } #content { margin-left: 30px; font-size: .70em; padding-bottom: 2em; } A:link { color: #336699; font-weight: bold; text-decoration: underline; } A:visited { color: #6699cc; font-weight: bold; text-decoration: underline; } A:active { color: #336699; font-weight: bold; text-decoration: underline; } .heading1 { background-color: #003366; border-bottom: #336699 6px solid; color: #ffffff; font-family: Tahoma; font-size: 26px; font-weight: normal;margin: 0em 0em 10px -20px; padding-bottom: 8px; padding-left: 30px;padding-top: 16px;} pre { font-size:small; background-color: #e5e5cc; padding: 5px; font-family: Courier New; margin-top: 0px; border: 1px #f0f0e0 solid; white-space: pre-wrap; white-space: -pre-wrap; word-wrap: break-word; } table { border-collapse: collapse; border-spacing: 0px; font-family: Verdana;} table th { border-right: 2px white solid; border-bottom: 2px white solid; font-weight: bold; background-color: #cecf9c;} table td { border-right: 2px white solid; border-bottom: 2px white solid; background-color: #e5e5cc;}</style> 
    </head> 
    <body> 
    <div id=""content""> 
     <p class=""heading1"">Reference for http://localhost:8000/Service/EchoDC</p> 
     <p></p> 
     <p xmlns=""http://www.w3.org/1999/xhtml""> 
     <b>Url: </b> 
     <span class=""uri-template"">http://localhost:8000/Service/EchoDC</span> 
     </p> 
     <p xmlns=""http://www.w3.org/1999/xhtml""> 
     <b>HTTP Method: </b> 
     <span class=""method"">POST</span> 
     </p> 
     <table> 
     <tr> 
      <th>Message direction</th> 
      <th>Format</th> 
      <th>Body</th> 
     </tr> 
     <tr> 
      <td>Request</td> 
      <td>Xml</td> 
      <td> 
      <a href=""#request-xml"">Example</a></td> 
     </tr> 
     <tr> 
      <td>Request</td> 
      <td>Json</td> 
      <td> 
      <a href=""#request-json"">Example</a> 
      </td> 
     </tr> 
     <tr> 
      <td>Response</td> 
      <td>Xml</td> 
      <td> 
      <a href=""#response-xml"">Example</a></td> 
     </tr> 
     </table> 
     <p> 
     <a name=""#request-xml"">The following is an example request Xml body:</a> 
     <pre class=""request-xml"">&lt;StackOverflow_7005187.MyDC xmlns=""http://schemas.datacontract.org/2004/07/WcfForums""&gt; 
    &lt;str&gt;This is a modified string content&lt;/str&gt; 
&lt;/StackOverflow_7005187.MyDC&gt;</pre> 
     </p> 
     <p> 
     <a name=""#request-json"">The following is an example request Json body:</a> 
     <pre class=""request-json"">{ 
    ""str"":""Some content in JSON"" 
}</pre> 
     </p> 
     <p> 
     <a name=""#response-xml"">The following is an example response Xml body:</a> 
     <pre class=""response-xml"">&lt;StackOverflow_7005187.MyDC xmlns=""http://schemas.datacontract.org/2004/07/WcfForums""&gt; 
    &lt;str&gt;Another modified XML content&lt;/str&gt; 
&lt;/StackOverflow_7005187.MyDC&gt;</pre> 
     </p> 
    </div> 
    </body> 
</html>"; 
      return WebOperationContext.Current.CreateStreamResponse(
       new MemoryStream(Encoding.UTF8.GetBytes(page)), 
       "text/html"); 
     } 
    } 
    public static void Test() 
    { 
     string baseAddress = "http://" + Environment.MachineName + ":8000/Service"; 
     ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress)); 
     host.AddServiceEndpoint(typeof(ITest), new WebHttpBinding(), "").Behaviors.Add(new WebHttpBehavior { HelpEnabled = false }); 
     host.Open(); 
     Console.WriteLine("Host opened"); 

     Console.Write("Press ENTER to close the host"); 
     Console.ReadLine(); 
     host.Close(); 
    } 
} 
+0

感謝您花時間爲此。這完全是自定義的,不是我想要的。我看到的另一種方法是檢查回覆信息並進行修改,這也不是很理想。正在尋找一種可以通過屬性或配置進行控制的方法。看起來沒有這樣的方式。 – fozylet

+0

嗯,我實際上無法獲得'WebGet(UriTemplate =「/ help」)'在我們的服務中工作。其他在我的服務中定義的URI工作正常,但沒有那個。 – ladenedge