2014-02-25 6 views
1

У меня есть раздражающая проблема: Я должен показать PDF в браузере (встроенный дисплей, а не скачать).ASP.NET: Почему у меня есть другой заголовок, который я установил?

До сих пор, с приведенным ниже кодом, он работает в Internet Explorer. Но в google-хром он просто загружается.

На этом же сервере работает стороннее приложение, которое делает то же самое.
Я полагаю, что проблема заключается в «приложении/октете-потоке», который вы видите в заголовке содержимого контента ...

Я нахожу это довольно раздражающим.
Мой код устанавливает содержание типа приложения/PDF, и когда я смотрю на реальные заголовки отправленных, я вижу, что это приложение/октет-поток ...

Согласно https://superuser.com/questions/219870/how-to-open-pdf-in-chromes-integrated-viewer-without-downloading-it#

это происходит потому, mime - это октет-поток вместо приложения/pdf ...

И у меня есть только один вопрос: почему? Зачем ? Зачем ? (Почему он устанавливает октет-поток, а не приложение/PDF, как указано в коде - см. Полный код ниже)
Бонусный вопрос: почему передается кодирование, если я задал Content-Length длину байтового массива?

Самое смешное, она отлично работает на моем локальном сервере разработки, так что это, кажется, что-то делать с пороками IIS> = 7 ...

Bad HTTP Headers

ASHX:

Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest 
     Dim baPDF As Byte() = GetPdfFromImage(Me.Data) 
     'context.Response.Write(COR.Tools.JSON.JsonHelper.Serialize(Me.Data(context))) 

     context.Response.Clear() 
     'context.Response.AddHeader("Content-Disposition", "attachment; filename=" + strFileName) 
     context.Response.AddHeader("Content-Disposition", Portal.ASP.NET.GetContentDisposition("Drucken.pdf", "inline")) 
     context.Response.AddHeader("Content-Length", baPDF.Length.ToString()) 
     ' context.Response.ContentType = "application/msword" 
     ' context.Response.ContentType = "application/octet-stream" 

     ' https://superuser.com/questions/219870/how-to-open-pdf-in-chromes-integrated-viewer-without-downloading-it# 
     ' context.Response.ContentType = "text/html" 
     context.Response.ContentType = "application/pdf" 



     context.Response.BinaryWrite(baPDF) 
     context.Response.Flush() 

     context.Response.End() 
    End Sub 





    ' COR.ASP.NET.StripInvalidPathChars("") ' 
    Public Shared Function StripInvalidPathChars(str As String) As String 
     Dim strReturnValue As String = Nothing 

     If str Is Nothing Then 
      Return strReturnValue 
     End If 

     Dim sb As System.Text.StringBuilder = New System.Text.StringBuilder() 
     Dim achrInvalidPathChars As Char() = System.IO.Path.GetInvalidPathChars() 


     For Each cThisChar As Char In str 
      Dim bIsValid As Boolean = True 

      For Each cInvalid As Char In achrInvalidPathChars 
       If cThisChar = cInvalid Then 
        bIsValid = False 
        Exit For 
       End If 
      Next cInvalid 

      If bIsValid Then 
       sb.Append(cThisChar) 
      End If 
     Next cThisChar 

     strReturnValue = sb.ToString() 
     sb = Nothing 
     Return strReturnValue 
    End Function ' StripInvalidPathChars ' 


    Public Shared Function GetContentDisposition(ByVal strFileName As String) As String 
     Return GetContentDisposition(strFileName, "attachment") 
    End Function ' GetContentDisposition ' 


    ' http://www.iana.org/assignments/cont-disp/cont-disp.xhtml ' 
    Public Shared Function GetContentDisposition(ByVal strFileName As String, ByVal strDisposition As String) As String 
     ' http://stackoverflow.com/questions/93551/how-to-encode-the-filename-parameter-of-content-disposition-header-in-http ' 
     Dim contentDisposition As String 
     strFileName = StripInvalidPathChars(strFileName) 

     If String.IsNullOrEmpty(strDisposition) Then 
      strDisposition = "inline" 
     End If 

     If System.Web.HttpContext.Current IsNot Nothing AndAlso System.Web.HttpContext.Current.Request.Browser IsNot Nothing Then 
      If (System.Web.HttpContext.Current.Request.Browser.Browser = "IE" And (System.Web.HttpContext.Current.Request.Browser.Version = "7.0" Or System.Web.HttpContext.Current.Request.Browser.Version = "8.0")) Then 
       contentDisposition = strDisposition + "; filename=" + Uri.EscapeDataString(strFileName).Replace("'", Uri.HexEscape("'"c)) 
      ElseIf (System.Web.HttpContext.Current.Request.Browser.Browser = "Safari") Then 
       contentDisposition = strDisposition + "; filename=" + strFileName 
      Else 
       contentDisposition = strDisposition + "; filename*=UTF-8''" + Uri.EscapeDataString(strFileName) 
      End If 
     Else 
      contentDisposition = strDisposition + "; filename*=UTF-8''" + Uri.EscapeDataString(strFileName) 
     End If 

     Return contentDisposition 
    End Function ' GetContentDisposition ' 

Это заголовок приложения 3 партии, где Chrome отображает его тонкой Aperture Headers

+0

У вас на самом деле есть правильные MIME, установленные на сервере? –

+0

Вы смотрели заголовки в других браузерах - они показывают приложение/pdf? – Paddy

+0

Вы рассмотрели проблему, описанную в этой статье? http://www.codeproject.com/Articles/671592/A-tale-of-ASP-NET-IIS-7-5-chunked-responses-and-ke –

ответ

1

Раствор так просто, как это отвратительное.

Благодаря изменению коллектива код был в файле ashx напрямую, а не в ashx.vb.

Хорошей частью этого является то, что вы можете изменить ashx на сервере, даже если у вас есть скомпилированное веб-приложение. Плохая часть, это имеет тот же эффект от компиляции «на лету» как проект веб-сайта.

Следовательно, когда вы просто перекомпилируете приложение и поместите MyWebApplication.dll на сервер, это оставляет старый ashx как есть.

И с ASP.NET использует код в ashx, а не скомпилированную dll, он всегда использует старый код, если вы не обновляете файл ashx.

Изменил его сейчас, и он начал работать немедленно.
Теперь это был хороший ...
В начале кода не было ошибки.

+0

Мой VS2008 не откроет файл .ashx по умолчанию, он открывает файл .ashx.vb, даже если вы дважды щелкните файл .ashx в обозревателе решений. Должно быть, это заняло какое-то дело, чтобы сломать его таким образом (!) Я предполагаю, что ваш коллега теперь в восторге от использования кода. –

+0

@Andrew Morton: щелкните правой кнопкой мыши и выберите «изменить разметку» или что бы он ни назывался. Другой способ - скопировать текст в окно блокнота и удалить файл .vb. –

+0

Не надо, не иди, давая всем понять, как добраться до него, или все они будут использовать «V * ew M * rk * p». Я смущенно знаю о многих способах испортить код моего сайта, я просто так не добрался до этого. ;) –

0

Перед настройкой нужного заголовка необходимо очистить заголовки.

От Microsoft's page Про Response.Clear.

Метод Clear не очищает информацию заголовка.

Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest 
    Dim baPDF As Byte() = GetPdfFromImage(Me.Data) 

    context.Response.ClearHeaders() 
    context.Response.ContentType = "application/pdf" 

    ... ' Cut for brevity 
End Sub 
+0

Нет, это не ClearHeaders(), я уже пробовал, что некоторое время назад. –

Смежные вопросы