2011-08-10 18 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

関連する問題