2

IIS 7 統合モードで実行されている従来の ASP.NET MVC Web サイトの一部として、WCF データ サービスをホストする必要があります。

Web サービスへの読み取りアクセスは正常に機能していますが、Web サービスに POST しようとすると、400 Bad Request エラーが発生します。

テスト目的で、サンプルの odata サービスをhttp://www.odata.org/developers/odata-sdk#/media/7582/odatasampleservices.zipからダウンロードしました。その Web サービスへの投稿は、別の IIS Web サイトで実行すると正常に機能します。ただし、レガシー Web サイトに配置すると、400 Bad Request エラーが発生し、ポスト リクエストがサービスに再度送信されます。

したがって、問題は 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>

ご協力いただきありがとうございます、

エイドリアン

編集:それが助けになるかどうかはわかりませんが、フィドラーの出力と失敗したリクエストのトレースは次のとおりです。

> curl -u ログイン:パス
> "http://www.worklogger.de:4567/Testapi/Testapi.svc/Projects"
> -v -d テスト
> * connect() を www.worklogger.de ポート 4567 (#0) にしようとしています
> * 192.168.0.109 を試行中... 接続済み
> * www.worklogger.de (192.168.0.109) ポート 4567 (#0) に接続
> * ユーザー 'login' で Basic を使用したサーバー認証
> POST /Testapi/Testapi.svc/Projects HTTP/1.1
> 認証: 基本 bG9naW46cGFzcw==
> ユーザーエージェント: curl/7.19.0 (i686-suse-linux-gnu) libcurl/7.19.0 OpenSSL/0.9.8h zlib/1.2.3 libidn/1.10
> ホスト: www.worklogger.de:4567
> 受け入れる: */*
> コンテンツの長さ: 4
> コンテンツ タイプ: application/x-www-form-urlencoded
>
< HTTP/1.1 400 不正な要求
< キャッシュ制御: プライベート
< サーバー: Microsoft-IIS/7.5
< X-AspNet-バージョン: 4.0.30319
< Set-Cookie: ASP.NET_SessionId=arrujp3wazcugm55v4ysyuew; パス=/; HttpOnly
< X-Powered-By: ASP.NET
< 日付: 2010 年 6 月 27 日 (日) 13:24:05 GMT
< コンテンツの長さ: 0
<
* ホスト www.worklogger.de への接続 #0 はそのまま残されます
* 接続 #0 を閉じる

StackOverflow では投稿が 50k を超えることは許可されていないため、失敗した要求トレースをhttp://pastebin.com/K3uEZfVSの pastebin に保存しました。

Edit2:まったく同じ Web サービスが (POST と GET の両方で) 正常に動作することをもう一度指摘したいと思います。したがって、問題は私がリクエストを行っている方法に関連することはできません.

4

5 に答える 5

0
  • 上記で投稿した web.config で、aspNetCompatibilityEnabled を false に設定しようとしましたか?

対応する属性が WCF サービスのコードで設定されていない場合 (デフォルトは AspNetCompatibilityRequirementsMode.NotAllowed)、サービスは aspNetCompatibilityEnabled が true に設定されているクライアントからの呼び出しを拒否します。

  • その設定が問題だった場合、ここに長期的な修正があります。属性 [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] を WCF サービス クラスに追加しました。
于 2010-06-27T20:53:56.927 に答える
0

Web サービスへのプロキシを実装することで問題を回避しました: http://code.google.com/p/fastajaxproxy/

于 2010-06-29T07:04:45.133 に答える
0

IIS で WebDav を無効にします。それは私のために働いた...ほとんどの場合、ポストメソッドは削除またはプット操作を実行するために使用されます。これを無効にすると、post で delete および put 操作を実行できるようになります

于 2010-09-29T17:40:37.547 に答える
0

ファイルを投稿している場合は、この質問で提案されている設定を見てください: IIS でホストされている大きなファイルのアップロードに関する WCF の問題

(および次の回答)。

お役に立てれば

于 2012-02-04T17:53:21.690 に答える
-1

このサービスはどの O/S でホストされていますか?
Vista 以降の場合は、FREB を使用して、パイプラインで失敗したものをデコードできます。 http://learn.iis.net/page.aspx/266/troubleshooting-failed-requests-using-tracing-in-iis-7/ Fiddler を実行して、サーバーからの HTTP エラー応答を特定できますか?

于 2010-06-29T04:41:35.213 に答える