【问题标题】:How does one implement a .Net WebService that does not encapsulate response in XML?如何实现一个不将响应封装在 XML 中的 .Net WebService?
【发布时间】:2011-09-10 12:06:16
【问题描述】:

我正在为一些数据编写一系列 Web 界面。我有 WebMethods 以 DataSet 和 XmlDataDocument 格式返回数据(XmlDataDocument 消除了所有架构开销。)

[WebMethod]
public XmlDataDocument Search_XML( string query ) {
  return new XmlDataDocument( Search_DataSet( query ) );
}
[WebMethod]
public DataSet Search_DataSet( string query ) {
  DataSet result = new DataSet( "SearchResults" );
  //... Populate DataSet here
  return result;
}

我还创建了一个函数,它接受一个 XSL 格式化字符串并返回格式化的结果,允许客户端格式化一个 HTML 响应,他们可以直接注入到他们的网页中:

public string Search_XSL( string query, string xsl ) {
  string result = "";
  XmlDataDocument resultxml = Search_XML( query );
  XslCompiledTransform transform = new XslCompiledTransform();
  using ( StringReader xslstringreader = new StringReader( xsl ) ) {
    using ( XmlReader xslxmlreader = XmlReader.Create( xslstringreader ) ) {
      using ( MemoryStream transformedmemorystream = new MemoryStream() ) {
        using ( StreamWriter transformedstreamwriter = new StreamWriter( transformedmemorystream ) ) {
          try {
            transform.Load( xslxmlreader );
            transform.Transform( resultxml, null, transformedstreamwriter );
            transformedstreamwriter.Flush();
            transformedmemorystream.Position = 0;
            using ( StreamReader transformedreader = new StreamReader( transformedmemorystream ) ) {
              result = transformedreader.ReadToEnd();
            }
          }
          catch ( Exception ex ) {
            result = ex.InnerException.ToString();
          }
        }
      }
    }
  }
  return result;

}

我的问题是,我如何为这个 Search_XSL() 函数实现一个类似 WebMethod 的接口,以便我可以像函数一样返回结果字符串,而不需要 WebMethod 对其进行 XML 编码?那会是一个新的 Web 表单吗?如何实现没有实际 HTML 的 Web 表单,只接受表单参数?不知道从哪里开始。

编辑:看起来“通用处理程序”.ashx 文件是要走的路。这是正确的方法吗?

【问题讨论】:

    标签: c# .net web-services


    【解决方案1】:

    如果您需要一个 HTTP 端点来处理 HttpContext 并返回自定义响应,那么通过通用 Web 处理程序 (*.ashx) 使用 IHttpHandler 将是正确的方法。

    您将从request query stringprocess the request 读取值。您的通用处理程序将使用 HttpContext.Response 将输出流的 content type 设置为 text/html 并将 write 您希望注入的结果 HTML。

    【讨论】:

      【解决方案2】:

      WCF 是进入 .net 的方式。您可以将您的方法配置为返回 json 或任意数量的其他类型的序列化。虽然通用处理程序可以工作,但对 wcf 的支持要好得多。查看此question 了解更多信息。

      【讨论】:

        【解决方案3】:

        WebMethods 使用 SOAP,这意味着您不能在服务层移除 SOAP 信封。你最初的想法是对的,这是你需要完成的:

            protected void Page_Load(object sender, EventArgs e)
            {
                Response.ContentType = "text/html";
                Response.Write("Hello world");
            }
        
            protected override void Render(HtmlTextWriter writer)
            {
            }
        

        这是一个快速而肮脏的解决方案,但它确实有效。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多