0

ASP.NET アプリケーションで、RabbitMQ のネイティブ クライアントを使用してメッセージ キューに書き込みたいと考えています。これを行うために、RabbitMQ dll を Web アプリケーションの /bin ディレクトリに置き、.aspx テスト ページを作成しました。

スクリプトをテストすると、次の例外が発生します。

問題をさらに詳しく調べると、dll が別のコンピューターの共有ディレクトリに物理的に格納されていることが原因であると考えられます。調査の結果、コード アクセス セキュリティ ポリシーを次のように調整することになりました。

c:\Windows\Microsoft.NET\Framework\v2.0.50727\CasPol.exe -m -ag 1 -url "file://\\server\IISSharedContent\webfarm\stage\dev-stage\bin\*" FullTrust -exclusive on

動作していないように見える IIS を再起動した後。

私も試しました:

  • アプリケーション プール ID を Network Service に設定する
  • アプリケーション プールの「ユーザー プロファイルの読み込み」を True に設定する
  • web.config への追加

誰かが私を助けることができる洞察を持っていますか?


完全なスタック トレース:

[SecurityException: Request for the permission of type 'System.Security.Permissions.EnvironmentPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.]
       System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet) +0
       System.Security.CodeAccessPermission.Demand() +54
       System.Environment.GetEnvironmentVariable(String variable) +135
       RabbitMQ.Client.Protocols.ReadEnvironmentVariable() +22
       RabbitMQ.Client.Protocols.FromEnvironment(String appSettingsKey) +37
       RabbitMQ.Client.ConnectionFactory..ctor() +176
       ASP.api_messagesearch_aspx.__Render__control1(HtmlTextWriter __w, Control parameterContainer) in \\server\iissharedcontent\webfarm\stage\dev-stage\api\MessageSearch.aspx:9
       System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +115
       System.Web.UI.Page.Render(HtmlTextWriter writer) +38
       System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +11070247
       System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +11069786
       System.Web.UI.Page.ProcessRequest() +91
       System.Web.UI.Page.ProcessRequest(HttpContext context) +240
       ASP.api_messagesearch_aspx.ProcessRequest(HttpContext context) in c:\Windows\Microsoft.NET\Framework64\v2.0.50727\Temporary ASP.NET Files\root\cb973a2c\79ccea1e\App_Web_x0q-uejx.0.cs:0
       System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +599
       System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +171

私のテストスクリプトのコード:

ConnectionFactory rabbitConFactory = new ConnectionFactory();
rabbitConFactory.Address = "hostname";
rabbitConFactory.VirtualHost = "/path";
rabbitConFactory.UserName = "user";
rabbitConFactory.Password = "password";

IConnection connection = rabbitConFactory.CreateConnection();

IModel channel = connection.CreateModel();

Dictionary<String, Object> args = new Dictionary<string, object>();
args.Add("x-ha-policy", "all");
String ExchangeName = "SearchInstructions";
channel.ExchangeDeclare(ExchangeName, "topic", true, false, args);

Guid myId = new Guid();
String RoutingKey = myId.ToString() + ".Instruction";
IBasicProperties MessageProperties = channel.CreateBasicProperties();
MessageProperties.SetPersistent(true);
MessageProperties.ContentEncoding = "UTF-8";
MessageProperties.ContentType = "text/xml";
MessageProperties.Headers.Add("x-origin",
Request.ServerVariables["ServerName"]);

String messageContent = "<foo />";
byte[] data = System.Text.Encoding.UTF8.GetBytes(messageContent);
channel.BasicPublish(ExchangeName,RoutingKey, MessageProperties, data);

channel.Close();
connection.Close();
4

1 に答える 1

0

この問題に 2 時間の大半を費やした結果、単純明快な解決策を思いつきました。

caspol.exe の 32 ビット バージョンと 64 ビット バージョンの両方を使用します。

この共有の信頼を適切に設定するために、caspol.exe を 2 回実行する必要がありました。

c:\Windows\Microsoft.NET\Framework\v2.0.50727\CasPol.exe -m -ag 1 -url "file://\\server\IISSharedContent\webfarm\stage\dev-stage\bin\*" FullTrust

そして実行

c:\Windows\Microsoft.NET\Framework64\v2.0.50727\CasPol.exe -m -ag 1 -url "file://\\server\IISSharedContent\webfarm\stage\dev-stage\bin\*" FullTrust

IIS を再起動すると、すべてがチャンピオンのように機能しました... (その他のバグは別として)。

于 2012-07-20T20:27:47.077 に答える