s23user Ответов: 1

Как создать пользовательский pdfhandler, который может загружать файл с другого файлового сервера


i need to write custom http handler (Pdf File Handler) for an existing application. 
File is located in shared folder in different server. 

I wrote customPdfFileHandler and place the dll to the bin dir of my webApplicaion. 

 
 Code in customPdfFileHandler is : 
 <pre lang="c#">public void ProcessRequest(HttpContext context)
        {

            dynamic emp = context.Session["EmpID"];
            if (emp == null || string.IsNullOrEmpty(emp))
            {
                HttpContext.Current.Response.StatusCode = 404;
                HttpContext.Current.Response.Flush();

            }
            else
            {
                context.Response.ClearContent();
                context.Response.ClearHeaders();
                context.Response.ContentType =  "application/pdf";
                context.Response.AddHeader("Content-Disposition", "attachment");
                context.Response.TransmitFile(context.Request.RawUrl);
                context.Response.Flush();
                context.Response.Clear();
                context.ApplicationInstance.CompleteRequest();
            }
		}


Но это выдает ошибку :


Запрошенный URL-адрес
http://localhost:55558/ip-myserver/d$/сайты/личные.объем/pdfFiles/архив/пример.формат PDF

Физический Путь
C:\Users\jdoe\Desktop\DemoFolder\DemoWeb\DemoWeb\ip-myserver\d$\Websites\mysites.net\pdfFiles\archive\Example.pdf

путь к файлу задается в файлах web.config веб-приложения.

Что я уже пробовал:

public void ProcessRequest(HttpContext context)
        {

            dynamic emp = context.Session["EmpID"];
            if (emp == null || string.IsNullOrEmpty(emp))
            {
                HttpContext.Current.Response.StatusCode = 404;
                HttpContext.Current.Response.Flush();

            }
            else
            {
                context.Response.ClearContent();
                context.Response.ClearHeaders();
                context.Response.ContentType =  "application/pdf";
                context.Response.AddHeader("Content-Disposition", "attachment");
                context.Response.TransmitFile(context.Request.RawUrl);
                context.Response.Flush();
                context.Response.Clear();
                context.ApplicationInstance.CompleteRequest();
            }
		}

1 Ответов

Рейтинг:
0

Richard Deeming

Необработанный URL-адрес определяется как часть URL-адреса, следующая за информацией о домене. В строке URL-адреса http://www.contoso.com/articles/recent.aspx, необработанный URL-адрес-это /articles/recent.aspx. Необработанный URL-адрес включает строку запроса, если она присутствует.

Итак, учитывая Ваш URL-адрес:
http://localhost:55558/ip-myserver/d$/Websites/mysites.net/pdfFiles/archive/Example.pdf

то RawUrl будет:
/ip-myserver/d$/Websites/mysites.net/pdfFiles/archive/Example.pdf

Это будет решено относительно текущего пути. Так что если ваше приложение находится на диске C:, он будет искать файл, расположенный в:
C:\ip-myserver\d$\Websites\mysites.net\pdfFiles\archive\Example.pdf

Похоже, вы пытаетесь загрузить файл из UNC-пути, который должен быть:
\\ip-myserver\d$\Websites\mysites.net\pdfFiles\archive\Example.pdf

Попробуйте что-нибудь вроде этого:
public void ProcessRequest(HttpContext context)
{
    dynamic emp = context.Session["EmpID"];
    if (emp == null || string.IsNullOrEmpty(emp))
    {
        HttpContext.Current.Response.StatusCode = 404;
        HttpContext.Current.Response.Flush();
        return;
    }
    
    Uri path;
    if (!Uri.TryCreate("file:/" + context.Request.RawUrl, UriKind.Absolute, out path))
    {
        HttpContext.Current.Response.StatusCode = 404;
        HttpContext.Current.Response.Flush();
        return;
    }
    
    context.Response.ClearContent();
    context.Response.ClearHeaders();
    context.Response.ContentType =  "application/pdf";
    context.Response.AddHeader("Content-Disposition", "attachment");
    context.Response.TransmitFile(path.LocalPath);
    context.Response.Flush();
    context.Response.Clear();
    context.ApplicationInstance.CompleteRequest();
}

NB: Вам нужно будет убедиться, что ваш пул приложений работает от имени пользователя, имеющего разрешение на чтение файлов из пути UNC. Вероятно, вам придется избегать использования общих ресурсов администратора по умолчанию (d$), а вместо этого переключитесь на использование определенных общих папок.


s23user

У меня есть доступ к пути \\networkShared\SHARED\john\ApplicationReview\ExeAppSchedule1.pdf

Запрошенный URL-адрес
http://localhost:8080/networkShared/SHARED/john/ApplicationReview/ExeAppSchedule1.pdf

Физический Путь
C:\TestPublish\TestLib\networkShared\SHARED\john\ApplicationReview\ExeAppSchedule1.pdf


вот как выглядит моя веб-конфигурация:

<конфигурация>
<appsettings>
&ЛТ;добавить ключ="pdfFile" значение="\\networkShared\общая\Джон\\ApplicationReview ExeAppSchedule1.PDF-файл " /&ГТ;

&ЛТ;система.веб&ГТ;
<компиляция targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
<identity impersonate="true" />

&ЛТ;система.модели&ГТ;
<компиляторы>
&ЛТ;компилятор языка="в C#;CS, который используется CSharp" расширение=".ЦС" тип="Майкрософт.граф CodeDOM.Услуги поставщиков.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.граф CodeDOM.Услуги поставщиков.DotNetCompilerPlatform, версия=1.0.0.0, культуры=нейтральный, значения PublicKeyToken=31bf3856ad364e35" предупреждение Уровень="4" компилятора параметры="/langversion:6 /ключевого слова:1659;1699;1701" /&ГТ;
&ЛТ;компилятор языка="ВБ;ВБС;на языке VisualBasic;по VBScript" расширение=".ВБ" тип="Майкрософт.граф CodeDOM.Услуги поставщиков.DotNetCompilerPlatform.VBCodeProvider, Microsoft.граф CodeDOM.Услуги поставщиков.DotNetCompilerPlatform, версия=1.0.0.0, культуры=нейтральный, значения PublicKeyToken=31bf3856ad364e35" предупреждение Уровень="4" компилятора параметры="/langversion:14 /ключевого слова:41008 /определить:_MYTYPE=\"веб\" /optionInfer+" /&ГТ;


&ЛТ;система.веб-сервер&ГТ;
<directoryBrowse enabled="true" />
<обработчики>
&ЛТ;добавить имя="PdfFile" путь="*.формат PDF" глагол="*" тип="CustomFileHandler.CustomFileHandler" resourceType="File" предварительное условие="integratedMode" />
&ЛТ;добавить имя="JpgFile" путь="*.форматы jpg" глагол="*" тип="CustomFileHandler.CustomFileHandler" resourceType="File" предварительное условие="integratedMode" />


F-ES Sitecore

Возможно, у вас есть доступ к этому файлу, но есть ли учетная запись, под которой работает ваш код? Если вы не изменили пользователя в IIS, это не произойдет. На вашем месте я бы скачал файл по протоколу http (используйте WebClient или что-то подобное) и затем отправил его клиенту, а не пытался бы напрямую получить доступ к файловой системе. Доступ к файловой системе другой машины осуществляется через asp.net это гораздо больше хлопот, если вы можете получить доступ к файлу через http.

s23user

Как мне загрузить файл через http, не могли бы вы, пожалуйста, провести меня через него?

F-ES Sitecore

Ответ здесь, кажется, делает то, что вы хотите

https://stackoverflow.com/questions/5596747/download-stream-file-from-url-asp-net

s23user

Я проверил эту ссылку, но не понял, как и что я передаю в качестве url-адреса при создании веб-запроса, поскольку файл, который я пытаюсь загрузить, находится на файловом сервере, но не на веб-сервере.