Modifikace obsahu   otázka

ASP.NET WebForms, ASP.NET MVC

Zdravím,

potřeboval bych v ASP.NET udělal tuto věc:

Na serveru mám řekněme soubor info.txt. Když někdo do prohlížeče tedy zadá mujweb.cz/info.txt, dostane tento soubor. Já bych v něm potřeboval ale udělat nějaké změny, a poslat ten soubor pozměněný. Změny by se ale neukládaly do souboru na serveru, ale spíš by se soubor jen načetl, programově upravil text, a tento text poslal jako odpověď.

Vím že to popisuji dosti kostrbatě, ale doufám že rozumíte.

Jak na to?

Děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zatím jsem to dělal tak, že v Global.asax v události Application_EndRequest jsem zjistil, jestli se někdo na tento soubor dotazuje, a pokud ano, následovalo:

this.Context.Response.Clear();                    this.Context.Response.Write("nový obsah");

na localhostu to funguje bez problému, ale pokud to nahraju na server, zobrazí se původní soubor bez modifikace

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Střílím od boku, takže mě neberte moc vážně, ale napadá mě, že by to mohlo být tím, že Váš prohlížeč ten soubor vytáhne z cache. Třeba se Vám to vrací s 304kou (Not Modified) a proto se prohlížeč domnívá, že ten soubor z cache vzít může. Zkuste explicitně nastavit Context.Response.StatusCode na 200. A nebo si to můžete ověřit tak, že si vynutíte obnovení cache prohlížečem pomocí CTRL+F5.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Bohužel, ani Response.StatusCode = 200; ani Ctrl + F5. Problém stále zůstává.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Beztak je to tím, že ASP.NET ISAPI handler se spouští jen pro aspx stránky a ne pro txt soubory. Jde to možná nějak změnit ve web.configu, ale záleží, co je to za hosting a jestli mají IIS6 nebo IIS 7 a classic nebo integrated mód.

Asi nejlepší řešení je místo souboru info.txt do projektu přidat Generic Handler info.ashx a v něm v metodě ProcessRequest na response napsat to, co tam chcete mít. Pak odkazujte na info.ashx a ne na info.txt. Tohle bude fungovat vždy.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1) Je to IIS7.

2) Proč mi to na localhost běží tedy?

3) tento soubor musí mít svou specifickou příponu. Jedná se o soubor psaný podle přesné specifikace. Pokut změním jeho příponu, stane se neplatným

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To že něco funguje na localhostu,neznamená ,že musí vše fungovat na "první našlápnutí" i na "ostrém" IIS. Musíte brát v potaz,že IIS použité ve VS není plnohodnotné a nedá se tak srovánavat s plným IIS.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

V tom případě zkuste do web.configu do sekce system.web přidat tohle.

<httpHandlers>
<add path="*.txt" verb="GET" type="System.Web.StaticFileHandler" validate="true" /> 
</httpHandlers>

A do sekce system.webServer tohle:

<handlers>
<add path="*.txt" name="TextFiles" verb="GET" type="System.Web.StaticFileHandler" /> 
</handlers>

Snad by to mělo fungovat, píšu to z hlavy, mohou tam být chyby.

Aplikace se chová jinak na hostingu a na vašem PC, to je normální - jedna pravděpodobně ani nemáte IIS, ale používáte Web Development Server ve VS, který je trochu jiný, a i kdybyste to provozoval na lokální IIS, tak budete mít pravděpodobně jiné nastavení, takže i tam mohou být rozdíly.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Díky .-)

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback