Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C#/VS2008/IIS7] Een mapping.xml uitlezen uit bin directory

Pagina: 1
Acties:
  • 806 views sinds 30-01-2008
  • Reageer

  • Jan_V
  • Registratie: Maart 2002
  • Laatst online: 12:22
Momenteel ben ik,ter oefening, weer eens een website voor mezelf aan het maken.
Ik maak nu gebruik van LINQ to SQL en heb een mapping.xml en mapping.cs bestand aangemaakt. Hierin staan logischerwijs de mappings naar de database en de objecten die ik in m'n projecten kan gebruiken.
In m'n data-access maak ik gebrtuik van de volgende code:
code:
1
2
3
4
String xmlMappingFile = System.Configuration.ConfigurationManager.AppSettings["VirtualRoot"].ToString() + @"bin/WeblogMapping.xml";
String connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;

DataContext ctx = new DataContext(connectionString, XmlMappingSource.FromUrl(xmlMappingFile));

In de datacontext stop ik de connectiestring en de locatie waar het XML mapping-bestand staat. Dit bestand is toegevoegd in het 'Information packages' project, samen met het CS mapping bestand.
Het XML-bestand wordt altijd meegenomen tijdens compilatie, waardoor deze in de bin-directory komt te staan van de presentatie-laag.

Probleem dat ik nu heb is dat er geen bestanden uit de bin-directory mogen worden gelezen/geladen.
Wanneer je in de browser de URL intikt krijg je deze fout:
HTTP-fout 404.8 - Not Found

De oplossing zou moeten zijn om de hiddenSegments aan te passen in het IIS configuratie bestand
code:
1
2
3
4
5
6
7
Meest waarschijnlijke oorzaken:

    * Het filteren van aanvragen wordt geconfigureerd voor de webserver en deze bevat een sectie hiddenSegments zodat de serverbeheerder de toegang tot specifieke mappen kan weigeren.

U kunt het volgende proberen:

    * Controleer de instellingen voor configuration/system.webServer/security/requestFiltering/hiddenSegments in het bestand applicationhost.config of web.config.


Het is uiteraard geen probleem om dit lokaal te doen, maar een wenselijke oplossing is het natuurlijk niet. Wanneer ik de website live zet kan ik natuurlijk niet het configuratie bestand bij m'n hoster aanpassen, aangezien die ook nog wel andere websites heeft draaien. Plus, het is een redelijk 'lek' in de standaard beveiliging van IIS lijkt me.

Een andere work-around is om het XML-mapping bestand in de root of een andere map te plaatsen. Dit lijkt me echter ook niet wenselijk, aangezien andere mensen dan zo je gehele database mapping bestand kunnen uitlezen. Ik kan me voorstellen dat dit ook een potentieel lek is in je website/database.

M'n vraag is dus of iemand ook een goede oplossing heeft voor dit probleem? Voor lokaal zou ik het op kunnen lossen door de hiddenSegments aan te passen of iets dergelijks, maar de uitgangssituatie is dat het bij een webhoster moet gaan draaien, waar ik zelf dus niet IIS instellingen kan gaan wijzigen.

Via Google kon ik weinig vinden met de zoekstring iis7 c# read file from bin directory en variaties daarop.

Battle.net - Jandev#2601 / XBOX: VriesDeJ


Verwijderd

Waar zet jij dan de database zelf neer? Niet in de bin map en ook niet in een gewone map van de website denk ik. Netjes op een plek waar niemand erbij kan als het goed is. Daar moet je bestanden als jouw mapping.xml ook neerzetten.

Webhosters bieden vaak een dergelijke mapstructuur:

/config
/database
/www

Waarbij /www dus de root is van de website. Dit kun je in IIS net zo maken. Trouwens, wat dacht je van App_Data?

[ Voor 8% gewijzigd door Verwijderd op 13-01-2008 21:54 ]


  • Jan_V
  • Registratie: Maart 2002
  • Laatst online: 12:22
Volgens mij kan ik bij m'n huidige webhoster niet zo 'diep' dat de /www, /config en /database mappen zichtbaar zijn.
Gisteravond in bed zat ik ook te denken aan de App_Data of obj-map. Die zouden vrij moeten kunnen worden gebruikt. Dat is waarschijnlijk dus ook de oplossing voor mij.
Zal het vanavond proberen. Mocht het niet lukken, dan zal ik iets anders verzinnen.

Battle.net - Jandev#2601 / XBOX: VriesDeJ


  • Jan_V
  • Registratie: Maart 2002
  • Laatst online: 12:22
De map App_Data blijkt ook onbereikbaar te zijn via code en de browser. Krijg je dezelfde melding als de bin-directory.
Momenteel heb ik het xml-bestand maar in de obj-directory geplaatst. Dit zal echter een tijdelijke oplossing zijn.
Ik zal eens zoeken daar de /database map of iets wat daar op lijkt. Misschien dat ik daar alsnog in kan komen.
Toch bedankt voor de suggestie.

Battle.net - Jandev#2601 / XBOX: VriesDeJ


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Nogal logisch dat je bestanden in de bin en app_data folder niet kunt opvragen via de browser. De bestanden welke hierin staan zijn ook helemaal niet voor de bezoeker, maar voor het functioneren van de website.

Maak gewoon een directory Database aan en zet daarin je mapping.xml. Ga geen bestanden toevoegen aan de obj directory want die is daar niet voor. Je treft toch ook geen duikpak aan als je gaat zonnen?

Advies vanaf mijn kant. Sluit Visual Studio en begin eerst eens met lezen in de MSDN. Dat weet je precies welke directory waarvoor is en waarom die nodig is. Je kunt mapping.xml natuurlijk ook gewoon in de root van je website zetten.

En als je bestanden in app_data zet, kun je deze het beste inlezen als normaal bestanden en niet via HTTP. Probeer eens System.Web.HttpContent.Current.Server.MapPath("~/app_data/mapping.xml") die geeft de locatie van je mapping.xml terug zoals die fysiek op de server staat bijv. c:\inetpub\wwwroot\website\app_data\mapping.xml

If it isn't broken, fix it until it is..


  • Gadgets
  • Registratie: Juni 2006
  • Laatst online: 16-11 22:52
Plus dat je de mapping file totaal niet nodig hebt, want op basis daarvan wordt je datacontext gegenereerd. Waarom gebruik je niet de DBML files, daar is VS2008 voor bedoeld en gebruik dan ook de interne LINQ to SQL designer, ik snap niet waarom je dit zelf wilt doen? 8)7

  • Jan_V
  • Registratie: Maart 2002
  • Laatst online: 12:22
Gadgets schreef op dinsdag 15 januari 2008 @ 10:20:
Plus dat je de mapping file totaal niet nodig hebt, want op basis daarvan wordt je datacontext gegenereerd. Waarom gebruik je niet de DBML files, daar is VS2008 voor bedoeld en gebruik dan ook de interne LINQ to SQL designer, ik snap niet waarom je dit zelf wilt doen? 8)7
Eerst had ik inderdaad een dbml-bestand gemaakt.
Het 'probleem' dat ik hiermee had gecreeerd is dat ik vanuit m'n presentatie- en business laag ook de database kon aanspreken en queries uitvoeren. Op zich geeft dat wel weer veel vrijheid, maar dan had ik ook wel van het 3-lagen-model kunnen afstappen.
Zelf heb ik tenminste (nog) geen manier kunnen vinden om in het dbml-bestand alleen de mapping te krijgen zonder de crud-functies.
Ga geen bestanden toevoegen aan de obj directory want die is daar niet voor.
Het was inderdaad niet m'n eerste keus en eigenlijk weet ik wel beter dan die map voor dit probleem te misbruiken. Het was echter een last-resort die ik kon bedenken, maar sloeg eigenlijk nergens op, aangezien die map net zo veilig is als ieder andere map op de webspace.
En als je bestanden in app_data zet, kun je deze het beste inlezen als normaal bestanden en niet via HTTP. Probeer eens System.Web.HttpContent.Current.Server.MapPath("~/app_data/mapping.xml") die geeft de locatie van je mapping.xml terug zoals die fysiek op de server staat bijv. c:\inetpub\wwwroot\website\app_data\mapping.xml
Dit is het correcte antwoord.
Ik had niet gedacht dat dit zou gaan werken in verband met rechten of iets dergelijks, vandaar dat ik hier ook niet naar heb gezocht of geprobeerd.
Lokaal werkt dit systeem, dus ik denk dat het ook geen problemen gaat opleveren op de server bij de provider.

[ Voor 38% gewijzigd door Jan_V op 15-01-2008 21:06 ]

Battle.net - Jandev#2601 / XBOX: VriesDeJ

Pagina: 1