Server.Transfer 时报 Error executing child request. 调试记录.

InnerException 为: {"Server cannot set content type after HTTP headers have been sent."}

经debug发现,是在:

  1  public string ContentType

 2     {
 3       get
 4       {
 5         return this._contentType;
 6       }
 7       set
 8       {
 9         if (this._headersWritten)
10         {
11           if (this._contentType != value)
12           {
13             throw new HttpException(System.Web.SR.GetString("Cannot_set_content_type_after_headers_sent"));
14           }
15         }
16         else
17         {
18           this._contentTypeSet = true;
19           this._contentType = value;
20         }
21       }
22     }

抛出的异常,调用是在:

   private void SetIntrinsics(HttpContext context, bool allowAsync)

    {
      ......

      HttpCapabilitiesBase browser 
= this._request.Browser;
      
this._response.ContentType = browser.PreferredRenderingMime;

当第二次设置 ContentType并且两次不一致时,就会出现这个错误. 那么第一次是我们自己的程序设置的,类型是Text/XML.第二次是系统设置的,

值是text/html .这样Exception就出现了.

我们需要返回的类型是XML,因此需要修改第二次设置的值,也就是说要更改 browser.PreferredRenderingMime,this._request.Browser.所以:

在 Server.Transfer前加入如下代码: 

1 MyHttpBrowserCapabilities browse = new MyHttpBrowserCapabilities();

2 browse.Capabilities = new Hashtable();
3 BrowserCapabilitiesFactory factroy = new BrowserCapabilitiesFactory();
4 factroy.ConfigureBrowserCapabilities(HttpContext.Current.Request.Headers, browse);
5 HttpContext.Current.Request.Browser = browse;
6 HttpContext.Current.Server.Transfer(....

Class MyHttpBrowserCapabilities 也很简单:

  1  public class MyHttpBrowserCapabilities : HttpBrowserCapabilities

 2     {
 3         
 4         public override string PreferredRenderingMime
 5         {
 6             get
 7             {
 8                 return "Text/XML";
 9             }
10         }
11     }

指示Mime一样而已.这样就不会出现Exception了. 

原文地址:https://www.cnblogs.com/huigll/p/1986315.html