Asp.net WCF数据服务返回400个错误的POST查询请求

Asp.net WCF数据服务返回400个错误的POST查询请求,asp.net,wcf,iis,wcf-data-services,odata,Asp.net,Wcf,Iis,Wcf Data Services,Odata,我需要托管一个WCF数据服务,作为在IIS 7集成模式下运行的传统ASP.NET MVC网站的一部分 对web服务的读取访问工作正常,但每当我尝试发布到web服务时,都会收到400个错误请求 出于测试目的,我从下载了样例odata服务。当在单独的IIS网站上运行该Web服务时,发布到该Web服务工作正常。然而,当我把它放在我的旧网站上时,我得到了400个错误的请求错误,并再次向该服务发送post请求 因此,问题似乎与我的ASP.NET MVC项目的配置有关。然而,我不知道如何进行 这是我在旧项目

我需要托管一个WCF数据服务,作为在IIS 7集成模式下运行的传统ASP.NET MVC网站的一部分

对web服务的读取访问工作正常,但每当我尝试发布到web服务时,都会收到400个错误请求

出于测试目的,我从下载了样例odata服务。当在单独的IIS网站上运行该Web服务时,发布到该Web服务工作正常。然而,当我把它放在我的旧网站上时,我得到了400个错误的请求错误,并再次向该服务发送post请求

因此,问题似乎与我的ASP.NET MVC项目的配置有关。然而,我不知道如何进行

这是我在旧项目中使用的web配置文件:

<?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>

因为StackOverflow不允许帖子增长超过50k

Edit2:我想再次指出,当将相同的web服务放在全新的ASP.NET MVC网站中时,它运行良好(POST和GET!),没有其他更改。因此,问题与我提出请求的方式无关。

  • 您是否尝试过在上面发布的web.config中将aspNetCompatibilityEnabled设置为false
如果WCF服务的代码中未设置相应的属性(默认值为AspNetCompatibilityRequirementsMode.NotAllowed),则该服务拒绝来自aspNetCompatibilityEnabled设置为true的任何客户端的调用

  • 如果这个设置是问题所在,这里 我补充说,这是长期的解决办法 这个
    [ASP网络兼容性要求(要求模式
    =AspNetCompatibilityRequirementsMode.Allowed)]
    到我的WCF服务类
      • 您是否尝试过在上面发布的web.config中将aspNetCompatibilityEnabled设置为false
      如果WCF服务的代码中未设置相应的属性(默认值为AspNetCompatibilityRequirementsMode.NotAllowed),则该服务拒绝来自aspNetCompatibilityEnabled设置为true的任何客户端的调用

      • 如果这个设置是问题所在,这里 我补充说,这是长期的解决办法 这个
        [ASP网络兼容性要求(要求模式
        =AspNetCompatibilityRequirementsMode.Allowed)]
        到我的WCF服务类

      此服务托管在哪个O/S上?
      如果是Vista或更高版本,您可以使用FREB解码管道中失败的内容。
      您可以运行Fiddler来识别服务器的HTTP错误响应是什么吗

      此服务托管在哪个O/S上?
      如果是Vista或更高版本,您可以使用FREB解码管道中失败的内容。
      您可以运行Fiddler来识别服务器的HTTP错误响应是什么吗

      我通过实现web服务的代理解决了这个问题:

      我通过实现web服务的代理解决了这个问题:

      在IIS中禁用WebDav。它对我有用。。。大多数时候,post方法用于执行删除或put操作。禁用此选项可使post执行删除和放置操作

      在IIS中禁用WebDav。它对我有用。。。大多数时候,post方法用于执行删除或put操作。禁用此选项可使post执行删除和放置操作

      如果您正在发布文件,请查看此问题中建议的设置:

      (以下是答案)


      希望这对您有所帮助

      如果您正在发布文件,请查看此问题中建议的设置:

      (以下是答案)



      希望这有助于回答这个愚蠢的问题,但您是否排除了MVC处理WCF服务的路径?我是否正确理解了get请求工作正常的问题?@R0MANARMY:是的,get请求工作正常。是的,我已经在globals.asax文件中排除了web服务的路径。另一个愚蠢的问题-你检查了所有机器之间的防火墙规则吗?@Oded:我在本地主机上测试时遇到了这个问题。此外,错误400 Bad Request意味着IIS认为请求的格式不正确,因此没有将其移交给应用程序进行处理。这将要求IIS首先接收请求…您是否尝试在fiddler打开的情况下运行此操作并捕获web流量?可能会给你更多的线索。愚蠢的问题,但是你是否排除了MVC处理WCF服务的路径?我是否正确理解了get请求工作正常的问题?@R0MANARMY:是的,get请求工作正常。是的,我已经在globals.asax文件中排除了web服务的路径。另一个愚蠢的问题-你检查了所有机器之间的防火墙规则吗?@Oded:我在本地主机上测试时遇到了这个问题。此外,错误400 Bad Request意味着IIS认为请求的格式不正确,因此没有将其移交给应用程序进行处理。这将要求IIS首先接收请求…您是否尝试在fiddler打开的情况下运行此操作并捕获web流量?可能会给你更多线索。我已经尝试将此属性添加到我的WCF数据服务中,但似乎没有任何效果。400错误请求错误仍然存在。在我的情况下,为了使属性生效,我必须自托管服务(手动执行serviceHost.Open(),而不是IIS按需执行)。排除兼容性问题的一个简单方法是在aspNetCompatibilityEnabled设置为false时调用该服务,您可以这样做吗?仔细想想,我的情况略有不同,aspNetCompatibilityEnabled=true与WCF服务位于同一应用程序中,这就阻止了客户机返回答案。您可以在调试模式下单步执行吗?应该存在故障或异常,浏览器中是否打开了“”或“”?或者有一个包含调用堆栈、异常、内部异常的死亡黄页?我已经尝试将此属性添加到我的WCF数据服务中,但似乎没有任何效果。四十 > 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) > * Trying 192.168.0.109... connected > * Connected to www.worklogger.de (192.168.0.109) port 4567 (#0) > * Server auth using Basic with user 'login' > POST /Testapi/Testapi.svc/Projects HTTP/1.1 > Authorization: Basic bG9naW46cGFzcw== > User-Agent: curl/7.19.0 (i686-suse-linux-gnu) libcurl/7.19.0 OpenSSL/0.9.8h 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 left intact * Closing connection #0