"服务器无法在发送 HTTP 标头之后设置内容类型"这个问题怎么解决呢?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了"服务器无法在发送 HTTP 标头之后设置内容类型"这个问题怎么解决呢?相关的知识,希望对你有一定的参考价值。

public static void init()

HttpContext.Current.Response.Write("<script language=javascript type=text/javascript>");
HttpContext.Current.Response.Write("function remove_loading() ");
HttpContext.Current.Response.Write("document.getElementById('loader_container').style.display='none';");
HttpContext.Current.Response.Write("document.getElementById('loader_container').style.visibility='hidden';");
HttpContext.Current.Response.Write("");
HttpContext.Current.Response.Write("</script>");
HttpContext.Current.Response.Write("<div id='loader_container' style='position:absolute; top:50%; left:50%'>");
HttpContext.Current.Response.Write("<img id='img' src='images/waitting.gif' />");
HttpContext.Current.Response.Write("</div>");
HttpContext.Current.Response.Flush();

这是一个等待效果。
然后我再用
private void Export(string FileType, string FileName)

Response.Charset = "GB2312";
Response.ContentEncoding = System.Text.Encoding.UTF7;
Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(FileName, Encoding.UTF8).ToString());
Response.ContentType = FileType;
this.EnableViewState = false;
StringWriter tw = new StringWriter();
htmlTextWriter hw = new HtmlTextWriter(tw);
GridView1.RenderControl(hw);
Response.Write(tw.ToString());
Response.End();

方法导出EXCEL的时候报“服务器无法在发送 HTTP 标头之后设置内容类型”错误!
问题:
怎样不让冲突?我试过Flush()之后关掉输出流,可是一关掉就停留在等待效果状态,这个问题怎么解决呢?

参考技术A 页面加载动作的js和Excel导出的Respones输出是冲突的,目前还没找到解决办法...
绕过冲突吧,例如弹出一个子窗口作为导出Excel的载体.或者服务器上生成Excel然后下载...避免Respones输出就行...

在 Java 中发送 HTTP 标头的问题

【中文标题】在 Java 中发送 HTTP 标头的问题【英文标题】:Problem sending HTTP headers in Java 【发布时间】:2010-11-23 00:34:40 【问题描述】:

我是否正确发送了 HTTPPost?我正在对照我的网络服务器检查我的encodedAuthString,并且可以验证该字符串是否正确。不知道为什么我无法进行身份验证。

public JSONObject connect(String url) 
            HttpClient httpclient = new DefaultHttpClient();

            // Prepare a request object
            HttpPost httppost = new HttpPost(url);

            String authString = usernameEditText.getText().toString() + ":" + passwordEditText.getText().toString();
            String encodedAuthString = Base64.encodeToString(authString.getBytes(),Base64.DEFAULT);
            String finalAuthString = "Basic " + encodedAuthString;

            // Execute the request
            HttpResponse response;
            try   
                httppost.addHeader("Authorization", finalAuthString);

                response = httpclient.execute(httppost);
                // Examine the response status
                Log.i("Praeda", response.getStatusLine().toString());

                // Get hold of the response entity
                HttpEntity entity = response.getEntity();

                if (entity != null) 

                    // A Simple JSON Response Read
                    InputStream instream = entity.getContent();
                    String result = convertStreamToString(instream);

                    // A Simple JSONObject Creation
                    JSONObject json = new JSONObject(result);

                    // Closing the input stream will trigger connection release
                    instream.close();

                    return json;
                

             catch (ClientProtocolException e) 
                e.printStackTrace();
             catch (IOException e) 
                e.printStackTrace();
             catch (JSONException e) 
                e.printStackTrace();
            

            return null;
        

        @Override
        protected JSONObject doInBackground(String... urls) 
            return connect(urls[0]);
        

        @Override
        protected void onPostExecute(JSONObject json) 
            String authorized = "200";
            String unauthorized = "401";
            String notfound = "404";
            String status = new String();

            try 
                // Get the messages array
                JSONObject response = json.getJSONObject("response");
                status = response.getString("status");

                if(status.equals(authorized))
                    Toast.makeText(getApplicationContext(), "Authorized",Toast.LENGTH_SHORT).show();
                else if (status.equals(unauthorized))
                    Toast.makeText(getApplicationContext(), "Unauthorized",Toast.LENGTH_SHORT).show();
                else if(status.equals(notfound))
                    Toast.makeText(getApplicationContext(), "Not found",Toast.LENGTH_SHORT).show();

             catch (JSONException e) 
                System.out.println(e);
             catch (NullPointerException e) 
                System.out.println(e);
            
        
    

更新:

当我对编码字符串进行硬编码时,一切都很好。

当我使用 Base64 编码器时,我得到与编码字符串相同的结果,但服务器返回 401。

【问题讨论】:

【参考方案1】:

您没有在此代码中设置任何标题。使用setHeader() 设置标题。这也包含在 HttpClient 的 documentation 中,来自您的 previous question 的信息也是如此。

Here is a sample project 设置授权标头。请注意,它使用单独的 Base64 编码器,因为内置的编码器仅在 Android 2.2 IIRC 中出现。

【讨论】:

@Sheehan Alam:考虑到我每个月都有几十个学生和更多的订阅者尝试我上面链接的示例,我对它的工作很有信心。您需要一个 identi.ca 帐户才能试用,包括点击他们发送的电子邮件确认。 @CommonsWare:谢谢。我已经更新了我的代码以匹配您的示例。我正在使用 addHeader() 和 setEntity() 但仍然没有运气。你的代码和我的几乎一模一样。 @CommonsWare:已更新。我对授权标头进行了硬编码,一切正常。当我不进行硬编码时,我会得到相同的字符串,但会从服务器返回 401。 @Sheehan Alam:如果您还没有这样做,请切换到我项目中包含的 Base64 编码器——我还没有尝试过 Android 2.2 中的那个。此外,如果这是您的服务器,请记录您在服务器端获取的身份验证字符串。 @CommonsWare:您的 Base64 编码器工作正常。我不确定为什么 Google 包含的编码器不起作用。感谢您的坚持和出色的榜样。【参考方案2】:

我在字符串中看到了额外的\n,所以我没有使用默认选项,而是使用了no_wrap 选项,如下所示:

Base64.encodeToString(authordata.getBytes(), Base64.NO_WRAP);

它对我有用。

【讨论】:

以上是关于"服务器无法在发送 HTTP 标头之后设置内容类型"这个问题怎么解决呢?的主要内容,如果未能解决你的问题,请参考以下文章

无法在发送 HTTP 标头之后进行重定向

更改 ajax 请求的 response.statuscode 会引发错误“发送 HTTP 标头后服务器无法设置状态”

无法向 Apache 服务器发出 http2 请求,尽管服务器在响应标头中发送“升级:h2”

NodeJS "发送到客户端 NodeJS 后无法设置标头"

发送HTTP标头后,服务器无法清除标头

如何解决错误? “服务器无法识别 HTTP 标头 SOAPAction 的值”