Dynamics CRM 4.0,在自定义ASPX页面上使用AJAX

时间:2009-06-29 09:44:18

标签: asp.net-ajax web-config dynamics-crm

我有一个自定义ASPX页面,我部署在ISV文件夹中。这页纸 包含ScriptManager控件。

为了加载页面,我需要在某处包含AJAX配置设置。对于自定义网站,我可以将配置放在web.config文件中。但是使用Dynamics CRM,不支持对web.config的更改......并且,尽可能地,我希望保持“支持”方面。

我尝试使用ASP.NET的“多配置文件”功能,并将一个web.config文件放在ISV文件夹中。但CRM应用程序似乎忽略了我的配置文件。

请告诉我如何在我的自定义ASPX页面上包含AJAX。

谢谢

2 个答案:

答案 0 :(得分:1)

参考MSCRM 4.0 Extension MOC,您可以在ISV文件夹中的自定义ASP.NET Web应用程序中包含您自己的web.config。

请注意,您可以删除根MS-CRM web.config使用的MapOrg和CrmAuthentication HttpModules。

这些是删除两个HttpModules

的示例代码段
<configuration>
  <system.web>
     <httpModules>
        <clear/>
     </httpModules>
  </system.web>
</configuration>

您还可以参考Ronald Lemmen postCesar post

希望这有帮助,

hadi teo

答案 1 :(得分:1)

如果从ISV \ yoursolution \ web.config中删除CrmAuthentication和MapOrg模块,则在调用Web服务时将无法重新使用最终用户的身份。

此解决方案允许您在CRM 4.0中使用UpdatePanel和ScriptManager,而无需修改CRM的web.config,也无需将ISV解决方案文件夹作为自己的IIS应用程序。

为此,我们需要使用响应过滤器修复ScriptManager控件的输出,以便Web浏览器尝试在ISV解决方案文件夹中请求ScriptResource.axd文件。然后,为了说服脚本资源处理程序处理请求,它必须看起来像是在根目录中请求它有两个愚蠢的原因。  因此,我们需要创建并连接我们自己的脚本资源处理程序,它只需修复并将请求代理到普通处理程序。

拦截并修复脚本标记,在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属性,以便它引用项目中的类名称空间和程序集名称。

然后在解决方案中包含这两个类:

/// <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));
    }
}

祝你好运!