WCF Data Service gibt 400 Bad Request für POST-Abfragen

Muss ich das hosten eines WCF Data service als Teil der ein Vermächtnis ASP.NET MVC-website in IIS 7 Integrierten Modus.

Lese-Zugriff auf die web-service ist in Ordnung, aber immer wenn ich versuche zu VERÖFFENTLICHEN, um den Webdienst, bekomme ich einen 400 Bad Request Fehler.

Für Testzwecke heruntergeladen habe ich das Beispiel odata-Dienst von http://www.odata.org/developers/odata-sdk#/media/7582/odatasampleservices.zip. Die Buchung auf das webservice funktioniert, wenn es läuft in einem separaten IIS-website. Allerdings, wenn ich es in mein legacy-website, ich bin geting, der mit 400 Bad Request Fehler, wen das senden einer post-Anforderung an den service wieder.

Daher scheint das problem zu sein in Bezug auf die Konfiguration meiner ASP.NET MVC-Projekt. Ich bin jedoch ratlos, wie zu Verfahren ist.

Dies ist die web-config-Datei, die ich in meiner legacy-Projekt:

<?xml version="1.0" encoding="utf-8"?>
<!-- 
 Note: As an alternative to hand editing this file you can use the 
 web admin tool to configure settings for your application. Use
 the Website->Asp.Net Configuration option in Visual Studio.
 A full list of settings and comments can be found in 
 machine.config.comments usually located in 
 \Windows\Microsoft.Net\Framework\v2.x\Config 
-->
<configuration>
 <configSections>
 <section name="combres" type="Combres.ConfigSectionSetting, Combres" />
 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net" />
 <sectionGroup name="elmah">
  <section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah" />
  <section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah" />
  <section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah" />
  <section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah" />
  <section name="errorMailSAZ" requirePermission="false" type="ElmahFiddler.ElmahMailSAZSectionHandler, ElmahFiddler" />
 </sectionGroup>
 </configSections>

 <combres definitionUrl="~/App_Data/combres.xml" />
 <log4net>
 <root>
  <level value="ALL" />
  <appender-ref ref="RollingFile" />
 </root>
 <logger name="Combres">
  <level value="DEBUG" />
 </logger>
 <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
  <file value="log.txt" />
  <appendToFile value="true" />
  <maximumFileSize value="100KB" />
  <maxSizeRollBackups value="2" />
  <layout type="log4net.Layout.PatternLayout">
  <conversionPattern value="%d [%t] %-5p %c - %m%n" />
  </layout>
 </appender>
 </log4net>
 <appSettings configSource="appSettings.config" />
 <connectionStrings configSource="connectionstrings.config">

 </connectionStrings>
 <!-- Mail server settings-->
 <system.net>
    <mailSettings/>
 </system.net>
 <system.web>
 <globalization uiCulture="de" culture="de-DE" />

 <compilation debug="true">
  <assemblies>
  <add assembly="System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
  <add assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
  <add assembly="Microsoft.ReportViewer.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
  <add assembly="System.Web.Abstractions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
  <add assembly="System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
  <add assembly="System.Data.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
  <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  <add assembly="System.Core, 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" />
  <add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
  </assemblies>
  <buildProviders>
  <add extension=".rdlc" type="Microsoft.Reporting.RdlBuildProvider, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  </buildProviders>
 </compilation>

 <authentication mode="Forms">
  <!-- User muessen sich nach 30 Tagen abwesenheit neu einloggen (wenn remember me angeklickt wird)-->
  <forms loginUrl="~/Profile/LogOn" timeout="43200" slidingExpiration="true" />
 </authentication>
 <membership>
  <providers>
  <clear />
  <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ApplicationServices" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="500" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" applicationName="/" />
  </providers>
 </membership>
 <profile>
  <providers>
  <clear />
  <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ApplicationServices" applicationName="/" />
  </providers>
 </profile>
 <roleManager enabled="true">
  <providers>
  <clear />
  <add connectionStringName="ApplicationServices" applicationName="/" name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  <add applicationName="/" name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  </providers>
 </roleManager>
 <customErrors configSource="customErrors.config" />
 <pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID">
  <namespaces>
  <add namespace="System.Web.Mvc" />
  <add namespace="System.Web.Mvc.Ajax" />
  <add namespace="System.Web.Mvc.Html" />
  <add namespace="System.Web.Routing" />
  <add namespace="System.Linq" />
  <add namespace="System.Collections.Generic" />
  <add namespace="xVal.Html" />
  <add namespace="Zeiterfassung.Views" />
  <add namespace="Zeiterfassung.Models" />
  <add namespace="Zeiterfassung" />
  <add namespace="GrigoreComponents.Generic" />
  <add namespace="DeverMind.Generic" />
  <!--<add namespace="MvcContrib.UI.Grid.ActionSyntax" />-->
  </namespaces>
 </pages>
 <httpHandlers>
  <add path="captcha.ashx" verb="GET" type="ManagedFusion.Web.Mvc.Handlers.CaptchaImageHandler, ManagedFusion, Version=1.0.3490.29346, Culture=neutral" validate="false" />
  <add path="*.mvc" verb="*" type="System.Web.Mvc.MvcHttpHandler, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" validate="false" />
  <!--<add path="VSEnterpriseHelper.axd" verb="GET" type="Microsoft.VisualStudio.Enterprise.Common.AspNetHelperHandler, Microsoft.VisualStudio.Enterprise.ASPNetHelper, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />-->
  <add path="Reserved.ReportViewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" validate="false" />
  <add path="/elmah.axd" verb="POST,GET,HEAD" type="Elmah.ErrorLogPageFactory, Elmah" />
 </httpHandlers>
 <httpModules>
  <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
 </httpModules>
 </system.web>
 <system.web.extensions>
 <scripting>
  <webServices>
  <authenticationService enabled="true" requireSSL="false" />
  </webServices>
 </scripting>
 </system.web.extensions>
 <!-- 
  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 runAllManagedModulesForAllRequests="true">
  <add name="Elmah.ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" />
  <add name="Elmah.ErrorFilter" type="Elmah.ErrorFilterModule" preCondition="managedHandler" />
  <add name="Elmah.ErrorMail" type="Elmah.ErrorMailModule" preCondition="managedHandler" />
  <add name="elmahSAZ" type="ElmahFiddler.ElmahMailSAZTraceModule, ElmahFiddler" />
 </modules>
 <handlers>
  <add name="Elmah" path="elmah.axd" verb="POST,GET,HEAD" type="Elmah.ErrorLogPageFactory, Elmah" preCondition="integratedMode" />
  <remove name="MvcHttpHandler" />
  <remove name="UrlRoutingHandler" />
  <add name="MvcHttpHandler" preCondition="integratedMode" verb="*" path="*.mvc" type="System.Web.Mvc.MvcHttpHandler, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" />
  <!--<add name="VSEnterpriseHelper.axd" verb="GET" path="VSEnterpriseHelper.axd" preCondition="integratedMode" type="Microsoft.VisualStudio.Enterprise.Common.AspNetHelperHandler, Microsoft.VisualStudio.Enterprise.ASPNetHelper, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>-->
  <add name="ReportViewerWebControlHandler" preCondition="integratedMode" verb="*" path="Reserved.ReportViewerWebControl.axd" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
 </handlers>
 <!--404 fehler sind was besonderes, ich will sie nicht in elmah sehen und ausserdem funktioniert es aus unbekannten gruenden eh nicht wenn ich sie auf dem hetzner-server per 
 customerrors handle-->
 <httpErrors>
  <remove statusCode="404" subStatusCode="-1" />
  <error statusCode="404" prefixLanguageFilePath="" path="/Error/FileNotFound" responseMode="ExecuteURL" />
 </httpErrors>
 <staticContent>
  <!--cache static content on the client side for 7 days-->
  <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="7.00:00:00" />
 </staticContent>
 <rewrite>
  <rules>
  <rule name="CanonicalHostName-Adrian" enabled="true" stopProcessing="true">
   <match url="(.*)" />
   <conditions>
   <add input="{HTTP_HOST}" pattern="^worklogger\.de:4567$" />
   </conditions>
   <action type="Redirect" url="http://www.worklogger.de:4567/{R:1}" />
  </rule>
  <rule name="CanonicalHostName-Sandra" enabled="true" stopProcessing="true">
   <match url="(.*)" />
   <conditions>
   <add input="{HTTP_HOST}" pattern="^worklogger\.de:7654$" />
   </conditions>
   <action type="Redirect" url="http://www.worklogger.de:7654/{R:1}" />
  </rule>
  <rule name="CanonicalHostName-Production" enabled="true" stopProcessing="true">
   <match url="(.*)" />
   <conditions>
   <add input="{HTTP_HOST}" pattern="^logmytime\.de$" />
   </conditions>
   <action type="Redirect" url="http://www.logmytime.de/{R:1}" />
  </rule>
  <rule name="RemoveTrailingSlashRule1" enabled="true" stopProcessing="true">
   <match url="(.*)/$" />
   <conditions>
   <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
   <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
   </conditions>
   <action type="Redirect" url="{R:1}" />
  </rule>
  <rule name="Rewrite rule for RewriteMap" enabled="true" stopProcessing="true">
   <match url=".*" />
   <conditions>
   <add input="{RewriteMap:{REQUEST_URI}}" pattern="(.+)" />
   </conditions>
   <action type="Redirect" url="{C:1}" appendQueryString="false" />
  </rule>
  <rule name="jquery-UI images" enabled="true" stopProcessing="true">
   <match url="(.*)combres.axd/UserAreaCSS/images/(.*)" />
   <conditions logicalGrouping="MatchAny"></conditions>
   <action type="Rewrite" url="Scripts/jquery-ui/css/custom-theme/images/{R:2}" />
  </rule>
    <rule name="Add API trailing slash without redirecting the user to a different domain" enabled="false" patternSyntax="ExactMatch" stopProcessing="true">
     <match url="API/V1/APi.svc" />
     <action type="Redirect" url="API/V1/APi.svc/" redirectType="Permanent" />
    </rule>
  </rules>
  <rewriteMaps>
  <rewriteMap name="RewriteMap">

   <add key="/Zeiterfassung/zeiterfassungssoftware.html" value="/Zeiterfassung/Arbeitszeit/Zeiterfassungssoftware" />
  </rewriteMap>
  </rewriteMaps>
 </rewrite>
 </system.webServer>
 <runtime>
 <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
  <assemblyIdentity name="Microsoft.VisualStudio.Enterprise.ASPNetHelper" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
  <codeBase version="9.0.0.0" href="file:///C:/Program%20Files%20(x86)/Microsoft%20Visual%20Studio%209.0/Common7/IDE/PrivateAssemblies/Microsoft.VisualStudio.Enterprise.ASPNetHelper.DLL" />
  </dependentAssembly>
  <dependentAssembly>
  <assemblyIdentity name="Microsoft.VisualStudio.Enterprise.ASPNetHelper" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
  <codeBase version="9.0.0.0" href="file:///C:/Program%20Files%20(x86)/Microsoft%20Visual%20Studio%209.0/Common7/IDE/PrivateAssemblies/Microsoft.VisualStudio.Enterprise.ASPNetHelper.DLL" />
  </dependentAssembly>
  <dependentAssembly xmlns="">
  <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
  <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
  </dependentAssembly>
 </assemblyBinding>
 </runtime>
 <location path="VSEnterpriseHelper.axd">
 <system.web>
  <authorization>
  <allow users="?" />
  </authorization>
 </system.web>
 </location>
 <!-- Deny everyone except siteadmins to see the elmah.axd -->
 <location path="elmah.axd">
 <system.web>
  <authorization>
  <allow roles="SiteAdmin" />
  <deny users="*" />
  </authorization>
 </system.web>
 </location>
 <system.serviceModel>
 <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
 </system.serviceModel>
</configuration>

Danke für Eure Hilfe,

Adrian

Edit: Nicht sicher, ob es irgendwelche helpe, aber hier ist der fiddler der Ausgabe und der Fehler bei der Anforderung trace:

> curl -u login:pass 
> "http://www.worklogger.de:4567/Testapi/Testapi.svc/Projects" 
> -v -d-test 
> * About to connect() to www.worklogger.de port 4567 (#0) 
> * Versuchen 192.168.0.109 verbunden... 
> * Verbunden www.worklogger.de (192.168.0.109) port 4567 (#0) 
> * Server mit Basic auth mit user 'login' 
> POST /Testapi/Testapi.svc/Projekte HTTP/1.1 
> Authorization: Basic bG9naW46cGFzcw== 
> User-Agent: curl/7.19.0 (i686-suse-linux-gnu) libcurl/7.19.0 OpenSSL/0.9.8 h zlib/1.2.3 libidn/1.10 
> Host: www.worklogger.de:4567 
> Accept: */* 
> Content-Length: 4 
> Content-Type: application/x-www-form-urlencoded 
> 
< HTTP/1.1 400 Bad Request 
< Cache-Control: private 
< Server: Microsoft-IIS/7.5 
< X-AspNet-Version: 4.0.30319 
< Set-Cookie: ASP.NET_SessionId=arrujp3wazcugm55v4ysyuew; path=/; HttpOnly 
< X-Powered-By: ASP.NET 
< Date: Sun, 27 Jun 2010 13:24:05 GMT 
< Content-Length: 0 
< 
* Connection #0 to host www.worklogger.de Links intakt 
* Closing connection #0 

Rettete ich den Fehler bei der Anforderung trace auf pastebin zu http://pastebin.com/K3uEZfVS seit StackOverflow nicht die Beiträge ermöglichen, zu wachsen, über 50k.

Edit2: ich möchte nochmal darauf hinweisen, dass die gleichen web-service läuft gut, (beide POST und GET!) wenn man es in einem nagelneuen ASP.NET MVC-website mit keine weiteren änderungen. Daher kann nicht das problem sein, in Bezug auf die Art und Weise, dass ich die Anfrage.

  • Blöde Frage, aber hast du ausschließen, dass der Pfad zum WCF-Dienst bearbeitet von MVC? Und verstehe ich die Frage richtig, dass get-Anfragen funktionieren?
  • Ja, get-Anfragen funktionieren einwandfrei. Und ja, ich werde ausgeschlossen haben, den Pfad zu dem web service in meinem globals.asax-Datei.
  • Eine dumme Frage - hast du überprüfen Sie die firewall-Regeln zwischen allen Maschinen?
  • Ich habe dieses problem beim testen auf "localhost". Auch der Fehler 400 Bad Request bedeutet, dass der IIS gilt als die Anfrage zu fehlerhaften und daher nicht übergeben es an die Anwendung für die Verarbeitung. Das würde erfordern, dass die Anfrage empfangen werden, indem Sie zuerst IIS...
  • Haben Sie versucht, läuft dieser mit fiddler auf und erfassen die web-traffic? Kann Ihnen weitere Hinweise.
  • Ich habe versucht, die Anfrage sowohl mit als Fiddler und Curl. Gleiche Ergebnis für beide, so tut es zu sein scheint, der server ist Schuld. Ich habe die curl-Ausgabe zu meinem Beitrag, falls es helfen könnte.
  • Sorry Adrian, kann nicht den Sinn dahinter. Haben Sie im Vergleich zu einem gelungenen GET-Anforderung?
  • haben Sie versucht, die Einstellung aspNetCompatibilityEnabled auf false? wenn es nicht in den WCF-Dienst, der default ist AspNetCompatibilityRequirementsMode.NotAllowed, versuchen, die gleiche Sache, aber mit aspNetCompatibilityEnabled auf false setzen, werden sehen, ob es funktioniert
  • Sie können versuchen, aktivieren der IIS-Protokollierung und bekommen von dort einen bestimmten code für status-code 400, und als Sie hier betrachten support.microsoft.com/kb/943891 für seine Beschreibung
  • Welche Anmeldung meinst du? Ich habe bereits im Zusammenhang mit der fehlgeschlagenen Anfrage-log-in meinem Beitrag oben.
  • Welche Art von Vergleich meinst du?
  • Ich meinte einen Vergleich von fiddler ' /curl-Ergebnisse für beide eine POST und GET
  • Ich spreche über die IIS-Protokollierung: technet.microsoft.com/en-us/library/cc732826(WS.10).aspx. Außer HTTP-status-codes es schreibt Windows-status-code, welcher (wenn er nicht 0 ist) können gefunden werden in dem link in meinem ersten Kommentar. Der Windows-status-code kann Ihnen helfen, zu finden, die bestimmte Fehler zusätzlich zu den üblichen "400 Bad Request"
  • Sowohl POST und GET display ein windows error code 0 bedeutet erfolgreich): 192.168.0.12, -, 6/28/2010, 10:49:51, W3SVC2, COREPLUG-7, 192.168.0.109, 3934, 301, 261, 400, 0, POST /Testapi/Testapi.svc/Projekte, -, 192.168.0.12, -, 6/28/2010, 10:50:05, W3SVC2, COREPLUG-7, 192.168.0.109, 813, 228, 87512, 200, 0, ERHALTEN, /Testapi/Testapi.svc/Projekte, -,
  • curl-Ausgang für die GET-Anforderung nicht alles zeigen hilfreich.
  • Ich sehe. Und Sie haben nichts in die windows event-logs?
  • Leider nicht. Es wäre überraschend, zu sehen, ein antry es trotzdem. Nachdem alle aus einer IIS-Sicht ist diese Anfrage war ungültig und daher behandelt werden, in der entsprechenden Weise: Mit einem 400 Bad Request Antworten.
  • Sind Sie die Veröffentlichung jeglicher Daten in das Formular? Es sieht nicht wie es jegliche form Elemente auf die POST. Vielleicht das ist, warum IIS denkt, dass es fehlerhaft ist.
  • Siehe Edit 2 oben.
  • Adrian - haben Sie die gleiche URL-rewrite-Regeln in beiden Seiten? Ich denke, dass vielleicht der rewrite-Auftritt und ist irgendwie falsch?
  • Ich habe gerade auskommentiert alle rewrite Regeln in meinem web.config, aber das problem bleibt das gleiche.
  • Was sind die großen Unterschiede zwischen den Websites, die arbeiten und die, die das nicht tut? Sind Sie auf der gleichen Maschine? Gleichen IIS-version? Gleiche Konfiguration des IIS? Als dieser Punkt, den ich versuchen würde, zu beseitigen, so viele Unterschiede wie möglich.
  • Gleiche Maschine, gleicher server, nur andere web-Anwendungen. Das ist, warum ich denke, das problem ist in der web.in der config von meinem legacy-Anwendung.
  • Was ist die Identität des Anwendungspools für beide Seiten? Sind Sie die gleiche Benutzer? Gleiche Berechtigungen?
  • Ja. Derselbe Benutzer mit denselben Berechtigungen
  • Haben Sie im Vergleich curl und fiddler protokolliert sowohl für die Website, die funktioniert und die man gar nicht?
  • Ja. Nichts schlüssig, soweit ich das sehen konnte.
  • stackoverflow.com/questions/3604188/...

Schreibe einen Kommentar