| 

.NET C# Java Javascript Exception

1
Hallo,

ich habe soeben meinen Test-WebService als Backend für jQuery/AJAX Autocomplete Funktionen innerhalb eines WebService fertiggestellt. Dieser soll nun ausgeweitet werden und echte Daten liefern und dabei in das Hauptprojekt integriert werden. Dabei stellt sich aber folgendes Problem.

In meiner Testumgebung fragt ein einfaches jQuery Script den Service wie folgt ab.
type: "POST",
url: "Service1.asmx/HelloWorld",
contentType: "application/json; charset=utf-8",


Der Server stellt die Anfrage also an sich selbst und an keinen externen Host. Später soll dieser natürlich auf einer fremden Maschine laufen. Daher hatte ich Testweise die Request URL auf die Host Adresse des ASP .NET Development Server gestellt.

type: "POST",
url: "http://localhost:1298/Service1.asmx/HelloWorld",
contentType: "application/json; charset=utf-8",


Allerdings kann ich nun per Firebug sehen, dass der WebService mir nur einen HTTP 500 Internal Server Error zurück gibt. Muss ich bei der Konfiguration was besonderes beachten wenn Anfragen von anderen Systemen verarbeitet werden sollen?

Edith sagt:

Inzwischen habe ich heraus finden können wie es zu dem 500 Error kam. Die "Anwednung" war im IIS nicht korrekt in eine solche Konvertiert. Dadurch konnte sich an der Maschine nicht richtig angemeldet werden und es kam zu einem Fehler. Allerdings habe ich mich nur auf 405 method not allowed "verbessern" :) Meine Ereignisanzeige ergibt dazu folgende Meldung,

Event code: 3005 
Event message: An unhandled exception has occurred.
Event time: 09.01.2012 23:27:39
Event time (UTC): 09.01.2012 22:27:39
Event ID: 8e691fff958a4b4b80f1e7a12b78a0a9
Event sequence: 6
Event occurrence: 1
Event detail code: 0

Application information:
Application domain: 55d99eef-1-129706216556610854
Trust level: Full
Application Virtual Path: /
Application Path: C:\DEV\JSONWebService1\
Machine name: Mx1

Process information:
Process ID: 7884
Process name: WebDev.WebServer20.exe
Account name: Mx1\User1

Exception information:
Exception type: HttpException
Exception message: Request format is unrecognized.

Request information:
Request URL: http://localhost:4283/Service1.asmx
Request path: /Service1.asmx
User host address: 127.0.0.1
User: Mx1\User1
Is authenticated: True
Authentication Type: NTLM
Thread account name: Mx1\User1

Thread information:
Thread ID: 8
Thread account name: Mx1\User1
Is impersonating: False
Stack trace: at System.Web.Services.Protocols.WebServiceHandlerFactory.CoreGetHandler(Type type, HttpContext context, HttpRequest request, HttpResponse response)
at System.Web.Services.Protocols.WebServiceHandlerFactory.GetHandler(HttpContext context, String verb, String url, String filePath)
at System.Web.Script.Services.ScriptHandlerFactory.GetHandler(HttpContext context, String requestType, String url, String pathTranslated)
at System.Web.HttpApplication.MapHttpHandler(HttpContext context, String requestType, VirtualPath path, String pathTranslated, Boolean useAppConfig)
at System.Web.HttpApplication.MapHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)


Custom event details:


Wenn man sich dazu etwas schlau macht, stößt man schnell auf einige (teils ältere) Beiträge. Beispiel Allerdings ändert dies nichts.

Die web.config ist bis auf die erwähnte Lösung, unangetastet und sieht so aus.

<?xml version="1.0"?>
<configuration>

<configSections>
<sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
<sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere" />
<section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication" />
<section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication" />
<section name="roleService" type="System.Web.Configuration.ScriptingRoleServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication" />
</sectionGroup>
</sectionGroup>
</sectionGroup>
</configSections>
<appSettings/>
<connectionStrings/>
<system.web>
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>

<!--
Visual Basic options:
Set strict="true" to disallow all data type conversions
where data loss can occur.
Set explicit="true" to force declaration of all variables.
-->
<compilation debug="true" strict="false" explicit="true">
<assemblies>
<add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
</assemblies>
</compilation>
<!--
The <authentication> section enables configuration
of the security authentication mode used by
ASP.NET to identify an incoming user.
-->
<authentication mode="Windows" />
<!--
The <customErrors> section enables configuration
of what to do if/when an unhandled error occurs
during the execution of a request. Specifically,
it enables developers to configure html error pages
to be displayed in place of a error stack trace.

<customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
<error statusCode="403" redirect="NoAccess.htm" />
<error statusCode="404" redirect="FileNotFound.htm" />
</customErrors>
-->
<pages>
<namespaces>
<clear />
<add namespace="System" />
<add namespace="System.Collections" />
<add namespace="System.Collections.Generic" />
<add namespace="System.Collections.Specialized" />
<add namespace="System.Configuration" />
<add namespace="System.Text" />
<add namespace="System.Text.RegularExpressions" />
<add namespace="System.Linq" />
<add namespace="System.Xml.Linq" />
<add namespace="System.Web" />
<add namespace="System.Web.Caching" />
<add namespace="System.Web.SessionState" />
<add namespace="System.Web.Security" />
<add namespace="System.Web.Profile" />
<add namespace="System.Web.UI" />
<add namespace="System.Web.UI.WebControls" />
<add namespace="System.Web.UI.WebControls.WebParts" />
<add namespace="System.Web.UI.HtmlControls" />
</namespaces>
<controls>
<add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</controls>
</pages>

<httpHandlers>
<remove verb="*" path="*.asmx"/>
<add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/>
</httpHandlers>

<httpModules>
<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</httpModules>
</system.web>
<system.codedom>
<compilers>
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" warningLevel="4"
type="Microsoft.VisualBasic.VBCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<providerOption name="CompilerVersion" value="v3.5"/>
<providerOption name="OptionInfer" value="true"/>
<providerOption name="WarnAsError" value="false"/>
</compiler>
</compilers>
</system.codedom>

<!--
The system.webServer section is required for running ASP.NET AJAX under Internet
Information Services 7.0. It is not necessary for previous version of IIS.
-->
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules>
<remove name="ScriptModule" />
<add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</modules>
<handlers>
<remove name="WebServiceHandlerFactory-Integrated"/>
<remove name="ScriptHandlerFactory" />
<remove name="ScriptHandlerFactoryAppServices" />
<remove name="ScriptResource" />
<add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode"
type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode"
type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</handlers>
</system.webServer>
<runtime>
<assemblyBinding appliesTo="v2.0.50727" xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>

</configuration>


UPDATE

Leider hilft es auch nicht dem IIS wie hier beschrieben über die Web.config zu erweitern. Ich erhalte immer noch die unten aufgeführte Exception. Im schlimmsten Falle muss ich mir einen Proxy bauen der die Ergebnisse per PHP->SOAP vom WebService abholt und als JSON String für jQuery aufbereitet. Aber damit verdoppele ich die Anfragen. Leider konnte ich auch keinen Weg finden die CORS Variante per JS zu unterdrücken. Ich werde nochmal die jQuery LIB aktualisieren.


ex.Message
Exception information: 
Exception type: HttpException
Exception message: Request format is unrecognized.

StackTrace
Thread information: 
Thread ID: 10
Thread account name: IIS APPPOOL\DefaultAppPool
Is impersonating: False
Stack trace: at System.Web.Services.Protocols.WebServiceHandlerFactory.CoreGetHandler(Type type, HttpContext context, HttpRequest request, HttpResponse response)
at System.Web.Services.Protocols.WebServiceHandlerFactory.GetHandler(HttpContext context, String verb, String url, String filePath)
at System.Web.Script.Services.ScriptHandlerFactory.GetHandler(HttpContext context, String requestType, String url, String pathTranslated)
at System.Web.HttpApplication.MaterializeHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
News:
07.01.2012
Slashi 409 2 8
Slashi 409 2 8
Schau mal auf dem Development Server in die Logs - sind da irgendwelche Exceptions erkennbar? HTTP 500 heißt meistens, dass der Server versucht hat, den Request zu bearbeiten, dabei aber irgendwo auf die Nase gefallen ist.
Matthias Hlawatsch 07.01.2012
Dummer Weise spuckt der IIS selbst keine ordentlichen Logs aus. Ich sehe nur den Request aber nicht das er mit einem Fehler beantwortet wurde oder warum. Von dem DEV Server wüsste ich nicht wo ich logs finden sollte.
Slashi 09.01.2012
Ich brauchte wohl eine Weile um festzustellen, dass die IIS Logs der falsche Ort um zu suchen :) Die Meldung aus der Ereignisanzeige steht weiter unten.
Slashi 09.01.2012
3 Antworten
1
Fehlt vielleicht die Datei clientaccesspolicy.xml?

Making a Service Available Across Domain Boundaries
08.01.2012
mblaess 1,2k 1 9
Da hatte ich auch schon dran gedacht, aber eigentlich sollte das keinen "Internal Server Error" hervorrufen, denn bei fehlender clientaccesspolicy.xml ist es ja der Client (Browser bzw. Silverlight-Runtime), der sagt: "Nein, dieser Aufruf könnte gefährlich sein, also laß ich das lieber."
Matthias Hlawatsch 09.01.2012
Das zeigt leider auch keine Wirkung. Es wird auch in dem Zusammenhang dauernd von einer Silverlight APP gesprochen. Ich denke hier wird noch unterschieden zwischen Silverlight und einer ASP Anwendung.

Inzwischen habe ich einige andere (teils verzweifelte) Versuche unternommen, unter anderem auch an der web.config. Inzwischen bekomme ich keinen 500 Error sondern einen 405 Method not allowed. Auch wenn ich durch ein neues Projekt eine "frische" web.config Datei erzeuge. Ich gehe davon aus das ich dies daran liegt das ich im IIS die Anwendung auch als eine solche gekennzeichnet habe.
Slashi 09.01.2012
Allerdings hilft mir dieser Fehler wenig weiter. Ich weiß leider nicht wie ich den IIS dazu kriege mit mitzuteilen, warum Anfragen mit Fehlern beantwortet werden. Inzwischen bin ich relativ verzweifelt... :(
Slashi 09.01.2012
1
Schau Dir doch mit Fiddler nochmal genau den Request an, der an den Server geht, und poste ihn ggf. hier. Ist es wirklich ein POST-Request? Hier hatte z.B. jemand das Problem, das tatsächlich erst einmal ein HEAD- bzw. OPTIONS-Request an den Server ging. Bei Deiner Config sind aber nur GET und POST erlaubt. HTTP 405 würde sehr gut dazu passen, dass der Server etwas anderes als GET oder POST empfangen hat.

Update
OK, da kommt tatsächlich ein OPTIONS-Request daher. Den dürfte Dein Server nicht mögen. Kurz gegoogelt, scheint ein mir bis eben unbekanntes Verfahren namens CORS der Grund dafür zu sein. Hat also wohl doch was mit Cross-Domain-Requests zu tun, nur anders, als mblaess vermutete. Ich muss mir das selbst erst mal genauer anschauen, aber was Google zu CORS und ASP.NET ausspuckt (eins, zwei, drei), scheint auf den ersten Blick brauchbar zu sein. Vielleicht hilft es Dir weiter? Anderer Ansatz wäre, CORS aktiv zu unterbinden (und Dich auf die gute alte Methode mit der clientaccesspolicy.xml zu verlassen). Keine Ahnung, ob sich das mit Javascript steuern läßt, denn es sieht ja so aus, als ob die Browser das von sich aus machen.
10.01.2012
Matthias Hlawatsch 13,2k 4 9
Ich werde mir Morgen die Zeit nehmen das mal in Ruhe anzuschauen. Ich denke auch, dass der bessere Weg ist, nach einer Lösung zu suchen CORS zu unterdrücken zumal es eigentlich gar nicht passieren sollte. Ich frage warum dies passiert.
Slashi 11.01.2012
0
Danke das ist mal ein praktisches und ebenso einfaches Tool! Hier der Header. Als Laie betrachtet sieht mir das aus als hättest Du recht. Anbei der Request Header.

OPTIONS /Service1.asmx HTTP/1.1
Host: localhost:4283
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:9.0.1) Gecko/20100101 Firefox/9.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Origin: http://localhost/
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Pragma: no-cache
Cache-Control: no-cache


(Header passt leider nicht in den Kommentar...)
11.01.2012
Slashi 409 2 8
Als weiteres Update der Frage wäre es vielleicht geschickter gewesen, aber wie auch immer: siehe das Update meiner Antwort.
Matthias Hlawatsch 11.01.2012

Stelle deine Javascript-Frage jetzt!