Dynamics crm CRM 2011具有相对URL的外部内容

Dynamics crm CRM 2011具有相对URL的外部内容,dynamics-crm,dynamics-crm-2011,dynamics-crm-4,Dynamics Crm,Dynamics Crm 2011,Dynamics Crm 4,在CRM 4.0中,我们可以将动态内容(aspx)放在CRM中的ISV文件夹中,创建单独的应用程序,但具有安全性和到CRM的相对URL,因此,例如,可以在iframe中使用沿 /ISV/CrmMvcApp/Account.aspx/Overview?id= 在CRM 2011中,不推荐使用ISV文件夹,Microsoft提供了一些关于如何过渡到以受支持的方式执行此操作的指导()。他们说: 对于Web资源功能无法满足的场景,请使用自己的Web.config在自己的应用程序池中创建Web应用程序 我

在CRM 4.0中,我们可以将动态内容(aspx)放在CRM中的ISV文件夹中,创建单独的应用程序,但具有安全性和到CRM的相对URL,因此,例如,可以在iframe中使用沿

/ISV/CrmMvcApp/Account.aspx/Overview?id=

在CRM 2011中,不推荐使用ISV文件夹,Microsoft提供了一些关于如何过渡到以受支持的方式执行此操作的指导()。他们说:

对于Web资源功能无法满足的场景,请使用自己的Web.config在自己的应用程序池中创建Web应用程序

我阅读这篇文章的方式(加上关于支持/不支持的指南)是,我们需要在IIS中有一个单独的网站,它有自己的绑定,因为不允许在标准CRM应用程序下添加虚拟目录等。这是不幸的,不允许在自定义设置和站点地图中使用相对路径/URL。这很麻烦,尤其是从DEV、TEST和/或PROD导出和导入解决方案时

  • 我的假设错了吗
  • 我们能有相对的路径吗
  • 是否有其他人找到了一种实用且简单的方法来获取外部内容,而无需对每个环境进行站点地图和自定义更改
编辑:与其他来源确认我对指南的理解是正确的,因为这也列在不支持的更改列表中。虚拟文件夹和web应用程序将与默认CRM网站完全分离

不支持在Microsoft Dynamics CRM网站内为任何VDir创建Internet信息服务(IIS)应用程序,特别是在ISV文件夹内


根据您的问题,不完全是“相对URL”,但我使用的解决方案是在配置实体中存储“存根”或“根”URL,并在运行时在JScript中读取这些记录,以确定自定义链接的完全限定目标

如果您主要需要访问CRM数据/记录,请查看如何使用jScript web资源。您可以使用REST OData服务执行“大多数”CRUD操作。如果您使用JQuery解析JSON,它的效率非常高。

我找到了一个与javascript重定向非常类似的解决方案,不需要客户端执行,只需配置一次环境详细信息(服务器名、端口)。可以很容易地添加额外的逻辑

该解决方案在自定义设置中创建了一个依赖项,但不是像这样的环境,并且可以用于非托管和托管解决方案

解决方案是在ISV文件夹中放置一个文件
Redirect.aspx
。该代码不以任何方式与CRM交互,并且在支持的指导原则范围内,但是解决方案不是未来的证明,因为Microsoft不推荐ISV文件夹

Redirect.aspx
将自动传递传递的任何参数,因此将使用或不使用实体标识符等等

用法:

  • 将文件放在CRM应用程序服务器上的ISV文件夹中
  • 更改服务器名称和端口以匹配当前环境(必须针对每个环境执行)
  • 在自定义中,例如对于iframe,使用以下内容作为源:

    /ISV/Redirect.aspx?redirect=http://SERVERREPLACE/CustomMvcApp/SomeControllerAction
    
以下是
Redirect.aspx

<%@ Page Language="C#" %>    
<html>
<script runat="server">
  protected override void OnLoad(EventArgs e)
  {
      // must be customized for each environment
      const string ServerBaseName = "appserver1:60001"; 
      const string UrlParameterName = "redirect";
      const string ReplacePattern = "SERVERREPLACE";

      var parameterUrl = Request.Params[UrlParameterName].Replace(ReplacePattern, ServerBaseName);

      var queryStringBuilder = new StringBuilder();

      foreach (var key in Request.QueryString.AllKeys)
      {
          if (key == UrlParameterName)
          {
              continue;
          }

          queryStringBuilder.Append(!(queryStringBuilder.Length > 0) ? "?" : "&");
          queryStringBuilder.Append(key + "=" + Request.QueryString[key]);
      }

      var completeRedirectString = parameterUrl + queryStringBuilder;

      Response.Redirect(completeRedirectString);
  }   
</script>
<head>
    <title>Redirecting</title>
</head>
</html>

受保护的覆盖无效加载(事件参数e)
{
//必须针对每个环境进行自定义
常量字符串ServerBaseName=“appserver1:60001”;
常量字符串UrlParameterName=“重定向”;
常量字符串ReplacePattern=“SERVERREPLACE”;
var parameterUrl=Request.Params[UrlParameterName].Replace(ReplacePattern,ServerBaseName);
var queryStringBuilder=new StringBuilder();
foreach(请求中的var key.QueryString.allkey)
{
if(key==UrlParameterName)
{
继续;
}
追加(!(queryStringBuilder.Length>0)?“?”:“&”);
queryStringBuilder.Append(key+“=”+Request.QueryString[key]);
}
var completeRedirectString=参数url+queryStringBuilder;
重定向(CompleteDirectString);
}   
重定向

这是我一直在考虑的解决方案之一,但我担心它的往返次数太多(?)。客户端将请求包含脚本Y的表单X。当页面加载时,脚本Y将执行,从CRM服务器请求URL,服务器将响应,javascript将作为示例更改iframe源。然后,客户机将从备选URL请求资源并获得响应——此时,我们将显示真实页面。因此,两次跳跃不仅仅是相对路径加上依赖于客户端执行。