日本語版
最新ニュース
企業

リモートサーバーはエラーを返しました:(400)悪い要求 – 古いOptimizely CMSサイトのAzureストレージを構成するとき

gulla.net ブログ リモートサーバーはエラーを返しました:(400)悪い要求 - 古いOptimizely CMSサイトのAzureストレージを構成するとき 最近、.NETフレームワークのさまざまなフレーバーでOptimizely CMS 11を実行しているOptimizelyサイトについての約8つのサイトを更新しました。 私がやろうとしたこと 仕事はかなり簡単でした。 ブロブコンテナを使用してAzureストレージリソースを作成します コンテナのSASトークンを生成します AzcopyコピーとSASトークンを使用してブロブを転送します Nugetパッケージをインストールします episerver.azure episerver.framework.configでblobプロバイダーを構成し、接続文字列とコンテナの名前を使用して構成します 問題 予想通り、これは4つのサイトで完全に機能しました。残りの4つのサイトについて、私は以下の例外に直面しました。 または:2)アプリケーションの構成ファイルに次のセクションを追加します。 この2番目の手法により、特定のアプリケーション内のすべてのファイルがデバッグモードでコンパイルされることに注意してください。最初の手法により、その特定のファイルのみがデバッグモードでコンパイルされます。重要:デバッグモードでアプリケーションを実行すると、メモリ/パフォーマンスのオーバーヘッドが発生します。生産シナリオに展開する前に、アプリケーションにデバッグが無効になっていることを確認する必要があります。スタックトレース: [WebException: The remote server returned an error: (400) Bad Request.] System.net.httpwebrequest.getResponse()+1751 Microsoft.windowsazure.storage.core.executor.executor.executesync(retccommand`1 cmd、iretrypolicyポリシー、OperationContext OperationContext) (x86) jenkins workspace…

リモートサーバーはエラーを返しました:(400)悪い要求 – 古いOptimizely CMSサイトのAzureストレージを構成するとき

1751222776
2025-06-26 09:21:00

最近、.NETフレームワークのさまざまなフレーバーでOptimizely CMS 11を実行しているOptimizelyサイトについての約8つのサイトを更新しました。

私がやろうとしたこと

仕事はかなり簡単でした。

  • ブロブコンテナを使用してAzureストレージリソースを作成します
  • コンテナのSASトークンを生成します
  • AzcopyコピーとSASトークンを使用してブロブを転送します
  • Nugetパッケージをインストールします episerver.azure
  • episerver.framework.configでblobプロバイダーを構成し、接続文字列とコンテナの名前を使用して構成します

問題

予想通り、これは4つのサイトで完全に機能しました。残りの4つのサイトについて、私は以下の例外に直面しました。

または:2)アプリケーションの構成ファイルに次のセクションを追加します。 この2番目の手法により、特定のアプリケーション内のすべてのファイルがデバッグモードでコンパイルされることに注意してください。最初の手法により、その特定のファイルのみがデバッグモードでコンパイルされます。重要:デバッグモードでアプリケーションを実行すると、メモリ/パフォーマンスのオーバーヘッドが発生します。生産シナリオに展開する前に、アプリケーションにデバッグが無効になっていることを確認する必要があります。スタックトレース: [WebException: The remote server returned an error: (400) Bad Request.] System.net.httpwebrequest.getResponse()+1751 Microsoft.windowsazure.storage.core.executor.executor.executesync(retccommand`1 cmd、iretrypolicyポリシー、OperationContext OperationContext) (x86) jenkins workspace release_dotnet_master lib classlibrarycommon core executor executor.cs:722 [StorageException: The remote server returned an error: (400) Bad Request.] Microsoft.windowsazure.storage.core.executor.executor.executesync(restcommand`1 cmd、iretrypolicyポリシー、OperationContext OperationContext)プログラムファイル(x86) jenkins workspace release_dotnet_master lib classlibrarycommon core executor executor.cs:649 episerver.azure.blobs.defaultazureblobcontainer.createifnotexist()+295システム [AggregateException: One or more errors occurred.] System.threading.tasks.task.waitall(task[] タスク、int32 millisecondstimeout、キャンセルトークンキャンセルトークン)+1264 episerver.framework。<> c__displayclass2_0。B__0(オブジェクトO、Eventgs E)+21 [TargetInvocationException: Exception has been thrown by the target of an invocation.] System.Runtimemethodhandle.invokemethod(オブジェクトターゲット、オブジェクト[] 引数、署名SIG、ブールコンストラクター)+0 System.Reflection.Runtimemethodinfo.UnsafeinvokeInternal(オブジェクトOBJ、オブジェクト[] パラメーター、オブジェクト[] 引数)+216 System.Delegate.DynamicInvokeimpl(Object[] args)+160 epirerver.framework.initialization.initializationEngine.OninitComplete()+312 episerver.framework.Initialization.InitializationEngine.executeTransition(boolean continueTransition)+208 Eisterver.framework.initialization.initializatialization.initializatialization.initializatialization.Initializatialization EngineAction)+408 Episerver.Framework.Initialization.InitializationModule.FrameWorkInitialization(hostType hostType)+226 episerver.global..ctor()+106 geonorge.episerverapplication..ctor()+43 asp.global_asax..ctor..ctor()+46 [TargetInvocationException: Exception has been thrown by the target of an invocation.] System.RuntimeTypeHandle.CreateInStance(RuntimeType Type、Boolean PublicOnly、Boolean Nocheck、Boolean&Canbecached、Runtimemetododhandleinternal&ctor、boolean&bneedsecuritycheck)+0 System.RuntimeType.createInstancesslow(Boolean、Boolean、Boolean、Boolean) fillcache、stackcrawlmark&stackmark)+142 System.activator.createinStance(タイプ、ブールの非公開)+107 System.runtimetype.createinStanceImpl(Bindingflags Bindingttr、バインダーバインダー、オブジェクト[] args、cultureinfo文化、オブジェクト[] ActivationAttributes、StackCrawlmark&Stackmark)+1473 System.activator.CreateInStance(タイプ、バインディングフラグバインディングトート、バインダーバインダー、オブジェクト[] args、cultureinfo文化、オブジェクト[] ActivationAttributes)+186 System.activator.createinStance(タイプタイプ、バインディングフラグバインディングバインディング、バインダーバインダー、オブジェクト[] Args、CultureInfo Culture)+28 System.web.httpruntime.createnOnpublicInstance(タイプ、オブジェクト[] args)+80 System.web.httpapplicationFactory.getSpecialApplicationInstance(intptr appContext、httpcontextコンテキスト)+182 System.Web.Hosting.Pipelinerurtime.InitializeApplication(intptr appContext)+369 [HttpException (0x80004005): Exception has been thrown by the target of an invocation.] System.web.httpruntime.firstrequestinit(httpcontext Context)+532 System.web.httpruntime.ensurefirstrequestinit(httpContext Context)+111 System.web.httpruntime.processrequestnotificationprivate(iis7workeRrequestext +33 width = “1111” height = “1285”/>

最初の考え

エラーメッセージがあまり役に立たなかったので、どこから始めればいいのかわかりませんでした。このエラーメッセージを使用した4つのソリューションには、あまり共通点がないようには見えませんでした。

  • それらはすべて、CMS 11の異なるバージョンを使用しました
  • 4.6.2から4.8の範囲の.NETフレームワークの3つの異なるバージョンを使用しました
  • 古いepiserver.searchを使用した人もいれば、検索とナビゲーションを使用した人もいます
  • episerver.formsを使用したものもあれば、そうでないものもありました

最初の試み、そして明るいアイデア

私の推測では、サーバーはおそらく«リモートサーバーがエラーを返したことに加えてメッセージを返した可能性があります。(400)悪い要求»。問題が何であるかを述べる。最初はそのようなメッセージへの道をデバッグする運がなかったので、私はそこで応答を調べることができると考えて、システムプロキシとしてフィドラーを起動しました。

フィドラーが起動したとき、すべてが魔法のように機能しました!画像はAzureストレージからロードされており、検査する例外はありませんでした!

私の最初のアイデアは、フィドラーがそこにいくつかの適応をするかもしれないので、これにはTLSのあるものがある可能性があるということでした。いくつかのソリューションには、すでにGlobal.asax.csでこのようなものがありましたが、残りをテストしました。それは助けにはなりませんでした。

ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12;

別の試み

次に、コードをコントロールしたコードから同じコール(上記で失敗した)を実行するようにテストしたので、これをコントローラーに追加しました。

using Microsoft.WindowsAzure.Storage;

var cloudBlobContainer = CloudStorageAccount.Parse(connectionString)
     .CreateCloudBlobClient()
     .GetContainerReference(containerName);

if (cloudBlobContainer.Exists())
{
     Console.WriteLine("Hello Blobs!");
}

うまくいった!次に、Global.asax.csからTLS 1.2を追加するコードを削除しましたが、失敗しました!今、私は通話とともにラインにブレークポイントを追加しました Exists()、そして、私はデバッガーを使用して応答を見つけることができました!それは私が最初から期待したことを言った:

The TLS version of the connection is not permitted on this storage account.

応答からのステータス説明は、間違ったTLSバージョンが問題であると述べています。

文章

再考する時間

そのため、Azureストレージと通信するコードを書くと、Global.AsaxからのTLSセッティングが尊重されます。

Optimizelyが座るコードを書いたとき EPiServer.Azure、コードをに呼び出します Microsoft.WindowsAzure.Storage、私のTLSセッティングは尊重されていません。

また、 ドキュメントによると、2025年11月までTLS 1.2に移動する必要はないはずです

解決策

もちろん、説明は、Optimizelyのコードが実行されることです Global.asax.csでapplication_startの前に実行する初期化モジュール。では、初期化モジュールの前にコードが実行されることを確認するにはどうすればよいですか?別の初期化モジュールを追加しますか?

あなたはいくつかの「黒い魔法」を実行できることがわかります web.config

を追加して targetFramework の属性 要素、できます アプリケーションで使用されるデフォルトのTLS設定に影響を与えます

これにより、私の影響を受けた4つのソリューションすべての問題が解決されました。 targetFramework 属性、最初から機能したものとは異なります。

.csprojファイルで使用されているフレームワークバージョンを次のように一致させるだけです。

それでおしまい!

#リモートサーバーはエラーを返しました400悪い要求 #古いOptimizely #CMSサイトのAzureストレージを構成するとき

執筆者について: nipponese

Nipponese News編集部は、国内外のニュースを日本語で分かりやすくお届けします。