2011-08-10 29 views
9

Đối với dịch vụ có webHttpBinding và helpEnabled = "true", thông tin trợ giúp sẽ được tạo đúng cách. Đã tự hỏi nếu nó có thể kiểm soát đầu ra bằng cách nào đó. Dưới đây là những thay đổi tôi muốn thực hiện.Tùy chỉnh đầu ra Trợ giúp WebHttp trong WCF

  1. Xóa trợ giúp JSON vì dịch vụ không hỗ trợ đầu ra JSON. Có nó có thể gây nhầm lẫn cho người dùng. Ít nhất, có một cách để đưa ra một lưu ý rằng JSON không được hỗ trợ.
  2. Đối với ví dụ trả lời được hiển thị, hãy sử dụng ví dụ tốt hơn "Nội dung chuỗi", nơi có thể chỉ định mẫu giá trị thực tế. Sẽ là tốt nếu tôi có thể cung cấp các đối tượng được sử dụng để được serialized như là ví dụ.

Trả lời

5

Trang trợ giúp dành cho WCF WebĐiểm cuối không thể tùy chỉnh. Bạn có thể, tuy nhiên, thay thế nó bằng trang tùy chỉnh của riêng bạn. Thật dễ dàng để được triển khai, nhưng có rất nhiều mã để viết. Ví dụ dưới đây cho thấy cách này có thể được thực hiện cho một dịch vụ đơn giản.

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

cảm ơn bạn đã dành thời gian cho việc này. làm nó hoàn toàn tùy chỉnh không phải là những gì tôi đang tìm kiếm mặc dù. cách tiếp cận khác tôi đã thấy là để kiểm tra tin nhắn trả lời và thay đổi, mà cũng không phải là lý tưởng. đang tìm kiếm một cách mà nó có thể được kiểm soát bởi các thuộc tính hoặc cấu hình. có vẻ như không có cách nào như vậy. – fozylet

+0

Hm, tôi không thực sự có thể nhận được 'WebGet (UriTemplate ="/help ")' để làm việc trong dịch vụ của chúng tôi. Các URI khác được định nghĩa trong dịch vụ của tôi hoạt động tốt, nhưng không phải là một. – ladenedge

Các vấn đề liên quan