HAVIT Knowledge Base

Vývoj webových aplikací, .NET, SQL, návrh
Welcome to HAVIT Knowledge Base Sign in | Join | Help
-
Home Články Forums Obrázky Soubory

ASP.NET

Vývoj webových aplikací ASP.NET

NullReferenceException v DefaultWsdlHelpGenerator.aspx při přístupu k webovým službám

Vytváříme klasickou webovou službu publikovanou pomocí ASMX. Při pokusu o přístup k této webové službě přes internetový prohlížet obdržíme výjimku NullReferenceException - a to ještě žádnou metodu nevoláme, jen prohlížíme dostupné služby.

Debugger se nám zastavuje v souboru DefaultWsdlHelpGenerator.aspx na řádku 1335:

1334
1335
1336
1337
    OperationBinding FindHttpBinding(string verb) {
foreach (ServiceDescription description in serviceDescriptions) {
foreach (Binding binding in description.Bindings) {
HttpBinding httpBinding = (HttpBinding)binding.Extensions.Find(typeof(HttpBinding));


Vskutku pozoruhodné je pak řešení problému: Ve web.configu máme v sekci <pages> nastavení autoEventWireUp="false". Po odstranění tohoto nastavení přístup k dokumentaci webových služeb funguje.

DefaultWsdlHelpGenerator.aspx je generátor dokumentace pro zobrazení v prohlížeči. Ten se evidentně kompiluje s použitím nastavení aplikace a v kódu spoléhá na zavolání metody Page_Load pomocí automatického navázání vybraných událostí (AutoEventWireUp). K dispozici máme i zdrojový kód tohoto souboru, standardně se nachází v C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG.

(Runtime .NET Framework 2.0)

Workaround

Na vývojářské mašině se dá taky rovnou zeditovat soubor C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\DefaultWsdlHelpGenerator.aspx a na první řádek přidat:

<%@ Page AutoEventWireup="true" %>

Published 4. prosince 2007 14:08 by Jiří Kanda
Filed under:

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS

Comments

 

Robert Haken said:

To už jsem taky řešil a byl jsem tehdy línej to do KB napsat "že snad něco takovýho už se nám nemůže znovu stát"... :-)))

prosince 4, 2007 16:31
 

Robert Haken said:

Stává se to nejvýše dvakrát za deset let... :-)))

prosince 4, 2007 16:32
 

Michal said:

priznam se, ze by me zajimal duvod, proc mate nastaveny autoEventWireUp="false".

Nejak si nemohu vybavit kdy by se toto nastaveni mohlo hodit....

prosince 4, 2007 19:40
 

Robert Haken said:

Michale, autoEventWireup máme u nás plošně zakázaný interními pravidly proto, že jeho použití vede k programátorským chybám. Na obsluhu událostí Page uvnitř stránky používáme výhradně override OnEvent (OnLoad, OnInit, atp.).

autoEventWireup je příšerný nesmysl z oblasti "programming for dummies", který funguje na principu konvence pojmenování obslužné metody a následné zoufalé reflexe. Programátorské chyby pak mohou vzniknout například:

1) Někdo se při editaci kódu omylem ucvakne a z názvu "Page_Load" udělá "Page_Locad", nevšimne si toho, projekt jde zkompilovat, nikde nic chybu nehlásí, ale stránka je v hajzlu.

2) Jeden programátor spoléhá na autoEventWireup, druhý naopak přihlašuje události ručně přes +=. Potkají se oba na jedné stránce a průser je na světě, Page_Load se bude volat dvakrát.

atp.

atp.

prosince 8, 2007 15:31

What do you think?

(required) 
(optional)
(required) 
Enter the code you see below

Submit