1

ISVフォルダに展開したカスタムASPXページがあります。このページには、ScriptManagerコントロールが含まれています。

ページをロードするには、AJAX構成設定をどこかに含める必要があります。カスタムWebサイトの場合、構成をweb.configファイル内に置くことができます。ただし、Dynamics CRMでは、web.configへの変更はサポートされていません...そして、可能な限り、「サポートされている」側にとどまりたいと思います。

ASP.NETの「複数の構成ファイル」機能を使用して、Web.configファイルをISVフォルダー内に配置しようとしました。しかし、CRMアプリケーションは私の設定ファイルを無視しているようです。

カスタムASPXページにAJAXを含める方法について教えてください。

ありがとうございました

4

2 に答える 2

1

MSCRM 4.0拡張MOCを参照すると、ISVフォルダー内のカスタムASP.NETWebアプリケーションに独自のweb.configを含めることができます。

ルートMS-CRMweb.configによって使用されるMapOrgおよびCrmAuthenticationHttpModulesを削除できることに注意してください。

これらは、2つのHttpModuleを削除するサンプルコードスニペットです。

<configuration>
  <system.web>
     <httpModules>
        <clear/>
     </httpModules>
  </system.web>
</configuration>

RonaldLemmenの投稿Cesarの投稿も参照できます。

お役に立てれば、

ハディテオ

于 2009-07-03T12:46:04.713 に答える
1

ISV\yoursolution\web.config から CrmAuthentication および MapOrg モジュールを削除すると、Web サービスを呼び出すときにエンド ユーザーの ID を再利用できなくなります。

このソリューションを使用すると、CRM の web.config を変更したり、ISV ソリューション フォルダーを独自の IIS アプリにすることなく、CRM 4.0 で UpdatePanel と ScriptManager を使用できます。

これを行うには、Web ブラウザーが ISV ソリューション フォルダー内の ScriptResource.axd ファイルを要求しようとするように、応答フィルターを使用して ScriptManager コントロールの出力を修正する必要があります。次に、スクリプト リソース ハンドラーに要求を処理させるには、ルート ディレクトリで要求されているように見せる必要があります。理由は 2 つあります。そのため、リクエストを単純に修正して通常のハンドラーにプロキシする独自のスクリプト リソース ハンドラーを作成して接続する必要があります。

スクリプト タグをインターセプトして修正するには、aspx ページの Load イベントで次のようにします。

protected void Page_Load(object sender, EventArgs e)
{
    Response.Filter = new ScriptResourceFixupFilter(Response.Filter);
}

次に、ハンドラーを接続して要求をインターセプトするには、ISV\yoursolution\web.config ファイルを変更します。configuration\system.web\httpHandlers セクションで、path="ScriptManager" を指定する add 要素をコメント アウトし、次のように新しい add 要素を挿入します。

  <!--<add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/>-->

  <add verb="GET,HEAD" path="ScriptResource.axd" type="YourNamespace.ScriptResourceHandlerProxy, YourAssemblyNameWithoutDllExtension"/>

プロジェクト内のクラスの名前空間とアセンブリ名を参照するように type 属性を設定してください。

次に、次の 2 つのクラスをソリューションに含めます。

/// <summary>
/// This is used to resolve compatibility issues with CRM's web.config, it doesn't have entries required for
/// the built in System.Web.Handlers.ScriptResourceHandler used Microsoft's ASP.Net Ajax components (i.e. ScriptManager, UpdatePanel, etc...)
/// 
/// This class will pick up the request for the script resource,
///  translates the request url so it appears to come at the to the app root path
/// </summary>
public class ScriptResourceHandlerProxy : System.Web.Handlers.ScriptResourceHandler
{
    protected override void ProcessRequest(HttpContext context)
    {
        // in order to trick the ScriptResourceHandler into handling this request, 
        //  we need to show it that the path of the request context is at the root of the web application
        var uri = new UriBuilder(context.Request.Url.AbsoluteUri)
        {
            Path = VirtualPathUtility.ToAbsolute("~/ScriptResource.axd"),
            Query = null
        };

        var compatableContext = new HttpContext(
            new HttpRequest("ScriptResource.axd", uri.Uri.ToString(), (context.Request.Url.Query ?? String.Empty).TrimStart('?')),
            context.Response);

        base.ProcessRequest(compatableContext);
    }
}

/// <summary>
/// This is used to resolve compatibility issues with CRM's web.config, it doesn't have entries required for
/// the built in System.Web.Handlers.ScriptResourceHandler used Microsoft's ASP.Net Ajax components (i.e. ScriptManager, UpdatePanel, etc...)
/// 
/// Replace references to src="/ScriptResource.axd" with "/ISV/YourSolution/ScriptResource.axd" so that the 
/// ASP.Net runtime picks up on our web.config entries that include the asp.net Ajax entries and passes the 
/// request along to our script resource handler proxy class
/// </summary>
public class ScriptResourceFixupFilter : MemoryStream
{
    private Stream _output;
    public ScriptResourceFixupFilter(Stream output)
    {
        this._output = output;
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
        var content = UTF8Encoding.UTF8.GetString(buffer);
        content = content.Replace(@"""/ScriptResource.axd", @"""/ISV/YourSolution/ScriptResource.axd");
        _output.Write(UTF8Encoding.UTF8.GetBytes(content), offset, UTF8Encoding.UTF8.GetByteCount(content));
    }
}

頑張ってください!

于 2012-03-04T17:37:50.877 に答える