代码之家  ›  专栏  ›  技术社区  ›  Adrian Grigore

WCF数据服务返回400个错误的后查询请求

  •  2
  • Adrian Grigore  · 技术社区  · 14 年前

    我需要作为旧版ASP.NET MVC网站的一部分,以IIs7集成模式运行WCF数据服务。

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

    出于测试目的,我已从下载了示例OData服务 http://www.odata.org/developers/odata-sdk#/media/7582/odatasampleservices.zip . 在单独的IIS网站上运行时,发布到该Web服务可以正常工作。但是,当我把它放在我的旧网站上时,我又收到了400个错误的请求,温再次向服务发送了一个请求。

    因此,问题似乎与我的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>
    

    谢谢你的帮助,

    阿德里安

    编辑: 不确定是否有帮助,但下面是fiddler输出和失败的请求跟踪:

    > 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
    

    我将失败的请求跟踪保存到Pastebin http://pastebin.com/K3uEZfVS 因为stackoverflow不允许邮件增长超过50K。

    编辑2: 我想再次指出,相同的Web服务运行良好(post和get!)当把它放到一个全新的ASP.NET MVC网站上时,没有其他更改。因此,问题不能与我提出请求的方式有关。

    5 回复  |  直到 12 年前
        1
  •  0
  •   GenEric35    14 年前
    • 在上面发布的web.config中,是否尝试将aspnetcompatibilityEnabled设置为false?

    如果在wcf服务的代码中没有设置相应的属性(默认值为aspnetcompatibilityrequirementsmode.notallowed),则该服务拒绝来自aspnetcompatibilityEnabled设置为true的任何客户端的调用。

    • 如果那个设置是问题所在,这里 我补充说,这是长期的解决办法吗? 这个 attribute [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 到我的WCF服务类
        2
  •  0
  •   Adrian Grigore    14 年前

    我通过实现Web服务的代理来解决这个问题: http://code.google.com/p/fastajaxproxy/

        3
  •  0
  •   Solomon    14 年前

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

        4
  •  0
  •   Community Doug McClean    7 年前

    如果要发布文件,请查看此问题中建议的设置: WCF problem with uploading large file, hosted in IIS

    (回答后)。

    希望这有帮助

        5
  •  -1
  •   Phani Raj    14 年前

    此服务托管在哪个O/S上?
    如果它的vista或更高版本,您可以使用freb来解码管道中失败的内容。 http://learn.iis.net/page.aspx/266/troubleshooting-failed-requests-using-tracing-in-iis-7/ 您能运行fiddler来识别服务器的HTTP错误响应是什么吗?