1

调用 a 上的Execute方法时Dynamics CRM 2011 service,将 ImportSolutionRequest 对象作为参数传递,引发以下 EndpointNotFound 异常:

There was no endpoint listening at  http://Server.com:5555/Organization/XRMServices/2011/Organization.svc that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details.

InnerException 是一个System.Net.WebException

{"The remote server returned an error: (404) Not Found."}

以下代码用于将解决方案导入 Dynamics CRM 2011 组织:

    public override bool Execute()
    {
        try
        {
            Log.LogMessage(Properties.Resources.importSolutionStarted);
            CustomNameSpace.Entities.Solution solution = new CustomNameSpace.Entities.Solution(new XrmConnection(DiscoveryServer, Port, Scheme, Organization, Domain, UserName, Password).Connection);
            solution.ImportSolution(SolutionFilePath);
            Log.LogMessage(Properties.Resources.importSolutionCompleted);
            return true;
        }
        catch (ApplicationException exception)
        {
            Log.LogMessage(exception.Message);
            return false;
        }
    }

这是解决方案类:

public partial class Solution
{
    public Solution(CrmConnection crmConnection)
    {
        CrmConnection = crmConnection;
        ProxyUri = new Uri(String.Format(CultureInfo.CurrentCulture, "{0}/XrmServices/2011/Organization.svc", CrmConnection.ServiceUri));
    }

    private Uri _proxyUri;

    public Uri ProxyUri
    {
        get
        {
            return _proxyUri;
        }
        set
        {
            _proxyUri = value;
        }
    }

    private CrmConnection _crmConnection;

    public CrmConnection CrmConnection
    {
        get
        {
            return _crmConnection;
        }
        set
        {
            _crmConnection = value;
        }
    }

    private IOrganizationService _crmService;

    public IOrganizationService CrmService
    {
        get
        {
            return _crmService;
        }
        set
        {
            _crmService = value;
        }
    }

    private OrganizationServiceProxy _crmProxy;

    public OrganizationServiceProxy CrmProxy
    {
        get
        {
            return _crmProxy;
        }
        set
        {
            _crmProxy = value;
        }
    }

    public Publisher CreatePublisher(string uniqueName, string friendlyName, Uri supportingWebsiteUrl, string customizationPrefix, string eMailAddress, string description)
    {
        try
        {
            Publisher crmSdkPublisher = new Publisher();
            using (CrmProxy = new OrganizationServiceProxy(ProxyUri, CrmConnection.HomeRealmUri, CrmConnection.ClientCredentials, CrmConnection.DeviceCredentials))
            {
                CrmProxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
                CrmProxy.Timeout = new TimeSpan(0, 10, 0);
                CrmService = (IOrganizationService)CrmProxy;
                if (supportingWebsiteUrl != null)
                {
                    crmSdkPublisher = new Publisher
                    {
                        UniqueName = uniqueName,
                        FriendlyName = friendlyName,
                        SupportingWebsiteUrl = supportingWebsiteUrl.AbsoluteUri,
                        CustomizationPrefix = customizationPrefix,
                        EMailAddress = eMailAddress,
                        Description = description
                    };
                    QueryExpression queryPublisher = new QueryExpression
                    {
                        EntityName = Publisher.EntityLogicalName,
                        ColumnSet = new ColumnSet("publisherid", "customizationprefix"),
                        Criteria = new FilterExpression()
                    };
                    queryPublisher.Criteria.AddCondition("uniquename", ConditionOperator.Equal, crmSdkPublisher.UniqueName);
                    EntityCollection queryPublisherResults;
                    queryPublisherResults = CrmService.RetrieveMultiple(queryPublisher);
                    Publisher SDKPublisherResults = null;
                    if (queryPublisherResults.Entities.Count > 0)
                    {
                        SDKPublisherResults = (Publisher)queryPublisherResults.Entities[0];
                        crmSdkPublisher.Id = (Guid)SDKPublisherResults.PublisherId;
                        crmSdkPublisher.CustomizationPrefix = SDKPublisherResults.CustomizationPrefix;
                    }
                    if (SDKPublisherResults == null)
                    {
                        crmSdkPublisher.Id = CrmService.Create(crmSdkPublisher);
                    }
                }
            }
            return crmSdkPublisher;
        }
        catch (FaultException<OrganizationServiceFault>)
        {
            throw;
        }
    }

    public Publisher RetrieveDefaultPublisher(string organizationName)
    {
        try
        {
            string DefaultPublisherPrefix = "DefaultPublisher";
            Publisher DefaultPublisher = RetrievePublisherByName(DefaultPublisherPrefix, organizationName);
            return DefaultPublisher;
        }
        catch (FaultException<OrganizationServiceFault>)
        {
            throw;
        }
    }

    public Publisher RetrievePublisherByName(string defaultPublisherPrefix, string organizationName)
    {
        Publisher DefaultPublisher = new Publisher();
        using (CrmProxy = new OrganizationServiceProxy(ProxyUri, CrmConnection.HomeRealmUri, CrmConnection.ClientCredentials, CrmConnection.DeviceCredentials))
        {
            CrmProxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
            CrmProxy.Timeout = new TimeSpan(0, 10, 0);
            CrmService = (IOrganizationService)CrmProxy;
            QueryExpression queryDefaultPublisher = new QueryExpression
            {
                EntityName = Publisher.EntityLogicalName,
                ColumnSet = new ColumnSet(true),
                Criteria = new FilterExpression()
            };
            queryDefaultPublisher.Criteria.AddCondition("uniquename", ConditionOperator.Equal, defaultPublisherPrefix + organizationName);
            Entity publisherEntity = CrmService.RetrieveMultiple(queryDefaultPublisher).Entities[0];
            if (publisherEntity != null)
            {
                DefaultPublisher = publisherEntity.ToEntity<Publisher>();
            }
        }
        return DefaultPublisher;
    }

    public Solution CreateSolution(string uniqueName, string friendlyName, Guid publisherId, string description, string version)
    {
        try
        {
            using (CrmProxy = new OrganizationServiceProxy(ProxyUri, CrmConnection.HomeRealmUri, CrmConnection.ClientCredentials, CrmConnection.DeviceCredentials))
            {
                CrmProxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
                CrmProxy.Timeout = new TimeSpan(0, 10, 0);
                CrmService = (IOrganizationService)CrmProxy;
                Solution solution = new Solution
                {
                    UniqueName = uniqueName,
                    FriendlyName = friendlyName,
                    PublisherId = new EntityReference(Publisher.EntityLogicalName, publisherId),
                    Description = description,
                    Version = version
                };
                QueryExpression querySampleSolution = new QueryExpression
                {
                    EntityName = Solution.EntityLogicalName,
                    ColumnSet = new ColumnSet(),
                    Criteria = new FilterExpression()
                };
                querySampleSolution.Criteria.AddCondition("uniquename", ConditionOperator.Equal, solution.UniqueName);
                EntityCollection querySampleSolutionResults = CrmService.RetrieveMultiple(querySampleSolution);
                Solution SampleSolutionResults = null;
                if (querySampleSolutionResults.Entities.Count > 0)
                {
                    SampleSolutionResults = (Solution)querySampleSolutionResults.Entities[0];
                    solution.Id = (Guid)SampleSolutionResults.SolutionId;
                }
                if (SampleSolutionResults == null)
                {
                    solution.Id = CrmService.Create(solution);
                }
                return solution;
            }
        }
        catch (FaultException<OrganizationServiceFault>)
        {
            throw;
        }
    }

    public Solution RetrieveSolution(string uniqueName)
    {
        try
        {
            Solution solution = new Solution();
            using (CrmProxy = new OrganizationServiceProxy(ProxyUri, CrmConnection.HomeRealmUri, CrmConnection.ClientCredentials, CrmConnection.DeviceCredentials))
            {
                CrmProxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
                CrmProxy.Timeout = new TimeSpan(0, 10, 0);
                CrmService = (IOrganizationService)CrmProxy;
                QueryExpression querySampleSolution = new QueryExpression
                {
                    EntityName = Solution.EntityLogicalName,
                    ColumnSet = new ColumnSet(true),
                    Criteria = new FilterExpression()
                };
                querySampleSolution.Criteria.AddCondition("uniquename", ConditionOperator.Equal, uniqueName);
                EntityCollection entityCollection = CrmService.RetrieveMultiple(querySampleSolution);
                if (entityCollection != null && entityCollection.Entities.Count > 0)
                {
                    Entity solutionEntity = entityCollection.Entities[0];
                    if (solutionEntity != null)
                    {
                        solution = solutionEntity.ToEntity<Solution>();
                    }
                }
                else
                {
                    querySampleSolution.Criteria = new FilterExpression();
                    querySampleSolution.Criteria.AddCondition("friendlyname", ConditionOperator.Equal, uniqueName);
                    entityCollection = CrmService.RetrieveMultiple(querySampleSolution);
                    if (entityCollection != null && entityCollection.Entities.Count > 0)
                    {
                        Entity solutionEntity = entityCollection.Entities[0];
                        if (solutionEntity != null)
                        {
                            solution = solutionEntity.ToEntity<Solution>();
                        } 
                    }
                }
            }
            return solution;
        }
        catch (FaultException<OrganizationServiceFault>)
        {
            throw;
        }
    }

    public void DeleteSolution(Entity solution)
    {
        try
        {
            using (CrmProxy = new OrganizationServiceProxy(ProxyUri, CrmConnection.HomeRealmUri, CrmConnection.ClientCredentials, CrmConnection.DeviceCredentials))
            {
                CrmProxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
                CrmProxy.Timeout = new TimeSpan(0, 10, 0);
                CrmService = (IOrganizationService)CrmProxy;
                if (solution != null)
                {
                    CrmService.Delete(Solution.EntityLogicalName, solution.Id);
                }
            }
        }
        catch (FaultException<OrganizationServiceFault>)
        {
            throw;
        }
    }

    public void DeleteSolution(string solutionUniqueName)
    {
        try
        {
            using (CrmProxy = new OrganizationServiceProxy(ProxyUri, CrmConnection.HomeRealmUri, CrmConnection.ClientCredentials, CrmConnection.DeviceCredentials))
            {
                CrmProxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
                CrmProxy.Timeout = new TimeSpan(0, 10, 0);
                CrmService = (IOrganizationService)CrmProxy;
                CrmService.Delete(Solution.EntityLogicalName, GetSolutionIdByUniqueName(solutionUniqueName));
            }
        }
        catch (FaultException<OrganizationServiceFault>)
        {
            throw;
        }
    }

    public void ImportSolution(string solutionFilePath)
    {
        try
        {
            byte[] fileBytes = File.ReadAllBytes(solutionFilePath);
            ImportSolutionRequest importSolutionRequest = new ImportSolutionRequest()
            {
                CustomizationFile = fileBytes
            };
            using (CrmProxy = new OrganizationServiceProxy(ProxyUri, CrmConnection.HomeRealmUri, CrmConnection.ClientCredentials, CrmConnection.DeviceCredentials))
            {
                CrmProxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
                CrmProxy.Timeout = new TimeSpan(0, 10, 0);
                CrmService = (IOrganizationService)CrmProxy;
                CrmService.Execute(importSolutionRequest);
            }
        }
        catch (FaultException<OrganizationServiceFault>)
        {
            throw;
        }
    }

    public string ExportSolution(string outputDir, string solutionUniqueName, bool managed)
    {
        try
        {
            if (!string.IsNullOrEmpty(outputDir) && !outputDir.EndsWith(@"\", false, CultureInfo.CurrentCulture))
            {
                outputDir += @"\";
            }
            string ManagedStatus;
            if (managed)
            {
                ManagedStatus = "Managed";
            }
            else
            {
                ManagedStatus = "UnManaged";
            }
            ExportSolutionRequest exportSolutionRequest = new ExportSolutionRequest();
            exportSolutionRequest.Managed = managed;
            exportSolutionRequest.SolutionName = solutionUniqueName;
            ExportSolutionResponse exportSolutionResponse;
            using (CrmProxy = new OrganizationServiceProxy(ProxyUri, CrmConnection.HomeRealmUri, CrmConnection.ClientCredentials, CrmConnection.DeviceCredentials))
            {
                CrmProxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
                CrmProxy.Timeout = new TimeSpan(0, 10, 0);
                CrmService = (IOrganizationService)CrmProxy;
                exportSolutionResponse = (ExportSolutionResponse)CrmService.Execute(exportSolutionRequest);
            }
            byte[] exportXml = exportSolutionResponse.ExportSolutionFile;
            string filename = solutionUniqueName + "_" + ManagedStatus + ".zip";
            File.WriteAllBytes(outputDir + filename, exportXml);
            return filename;
        }
        catch (FaultException<OrganizationServiceFault>)
        {
            throw;
        }
    }

    public void RollbackSolution(string uniqueName, string solutionFullPath)
    {
        try
        {
            DeleteSolution(uniqueName);
            ImportSolution(solutionFullPath);
            using (CrmProxy = new OrganizationServiceProxy(ProxyUri, CrmConnection.HomeRealmUri, CrmConnection.ClientCredentials, CrmConnection.DeviceCredentials))
            {
                CrmProxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
                CrmProxy.Timeout = new TimeSpan(0, 10, 0);
                CrmService = (IOrganizationService)CrmProxy;
                CrmService.Execute(new PublishAllXmlRequest());
            }
        }
        catch (FaultException<OrganizationServiceFault>)
        {
            throw;
        }
    }

    public Collection<Solution> RetrieveAllSolutions()
    {
        try
        {
            Collection<Solution> solutions = new Collection<Solution>();
            using (CrmProxy = new OrganizationServiceProxy(ProxyUri, CrmConnection.HomeRealmUri, CrmConnection.ClientCredentials, CrmConnection.DeviceCredentials))
            {
                CrmProxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
                CrmProxy.Timeout = new TimeSpan(0, 10, 0);
                CrmService = (IOrganizationService)CrmProxy;
                OrganizationServiceContext ServerContext = new OrganizationServiceContext(CrmService);
                var items = from item in ServerContext.CreateQuery<Solution>()
                            orderby item.Version ascending
                            where item.IsVisible == true
                            select item;
                foreach (var item in items)
                {
                    solutions.Add(item);
                }
            }
            return solutions;
        }
        catch (FaultException<OrganizationServiceFault>)
        {
            throw;
        }
    }

    public Guid GetSolutionIdByUniqueName(string uniqueName)
    {
        try
        {
            Guid solutionQuery;
            using (CrmProxy = new OrganizationServiceProxy(ProxyUri, CrmConnection.HomeRealmUri, CrmConnection.ClientCredentials, CrmConnection.DeviceCredentials))
            {
                CrmProxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
                CrmProxy.Timeout = new TimeSpan(0, 10, 0);
                CrmService = (IOrganizationService)CrmProxy;
                OrganizationServiceContext ServerContext = new OrganizationServiceContext(CrmService);
                solutionQuery = (from item in ServerContext.CreateQuery<Solution>()
                                 where item.UniqueName == uniqueName
                                 select item.SolutionId.Value).Single<Guid>();
            }
            return solutionQuery;
        }
        catch (FaultException<OrganizationServiceFault>)
        {
            throw;
        }
    }

    public AddSolutionComponentResponse AddComponentToSolution(componenttype solutionComponentType, Guid componentId, string solutionUniqueName)
    {
        try
        {
            AddSolutionComponentRequest addSolutionComponentRequest = new AddSolutionComponentRequest()
            {
                ComponentType = (int)solutionComponentType,
                ComponentId = componentId,
                SolutionUniqueName = solutionUniqueName
            };
            using (CrmProxy = new OrganizationServiceProxy(ProxyUri, CrmConnection.HomeRealmUri, CrmConnection.ClientCredentials, CrmConnection.DeviceCredentials))
            {
                CrmProxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
                CrmProxy.Timeout = new TimeSpan(0, 10, 0);
                CrmService = (IOrganizationService)CrmProxy;
                return (AddSolutionComponentResponse)CrmService.Execute(addSolutionComponentRequest);
            }
        }
        catch (FaultException<OrganizationServiceFault>)
        {
            throw;
        }
    }

    public void PublishCustomizations()
    {
        try
        {
            using (CrmProxy = new OrganizationServiceProxy(ProxyUri, CrmConnection.HomeRealmUri, CrmConnection.ClientCredentials, CrmConnection.DeviceCredentials))
            {
                CrmProxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
                CrmProxy.Timeout = new TimeSpan(0, 10, 0);
                CrmService = (IOrganizationService)CrmProxy;
                CrmService.Execute(new PublishAllXmlRequest());
            }
        }
        catch (ApplicationException)
        {
            throw;
        }
    }
}

解决方案类使用 CrmConnection 类,如下所示:

public class XrmConnection
{
    public XrmConnection()
    {
    }

    public XrmConnection(string discoveryServer, string port, string scheme, string organization, string domain, string userName, string password)
    {
        DiscoveryServer = discoveryServer;
        Port = port;
        Scheme = scheme;
        Domain = domain;
        UserName = userName;
        Password = password;
        Organization = organization;
        InstantiateOrganization();
        InstantiateConnection();
    }

    public string DiscoveryServer { get; set; }

    public string Port { get; set; }

    public string Scheme { get; set; }

    public string Organization { get; set; }

    public string Domain { get; set; }

    public string UserName { get; set; }

    public string Password { get; set; }

    [CLSCompliant(false)]
    public CrmConnection Connection { get; set; }

    private Uri discoveryServiceUri { get; set; }

    private OrganizationDetailCollection Orgs { get; set; }

    private OrganizationDetail Org { get; set; }

    private RetrieveOrganizationsRequest OrgRequest { get; set; }

    private RetrieveOrganizationsResponse OrgResponse { get; set; }

    private OrganizationDetail orgDetail { get; set; }

    private void InstantiateOrganization()
    {
        ClientCredentials clientCredentials = new ClientCredentials();
        if (!string.IsNullOrEmpty(Domain))
        {
            clientCredentials.Windows.ClientCredential.Domain = Domain;
        }
        if (!string.IsNullOrEmpty(UserName))
        {
            clientCredentials.Windows.ClientCredential.UserName = UserName;
        }
        if (!string.IsNullOrEmpty(Password))
        {
            clientCredentials.Windows.ClientCredential.Password = Password;
        }
        if (string.IsNullOrEmpty(UserName))
        {
            clientCredentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials;
        }
        if (!string.IsNullOrEmpty(Port))
        {
            discoveryServiceUri = new Uri(String.Format(CultureInfo.CurrentCulture, "{0}://{1}:{2}/XRMServices/2011/Discovery.svc", Scheme, DiscoveryServer, Port));
        }
        else
        {
            discoveryServiceUri = new Uri(String.Format(CultureInfo.CurrentCulture, "{0}://{1}/XRMServices/2011/Discovery.svc", Scheme, DiscoveryServer));
        }
        using (DiscoveryServiceProxy ServiceProxy = new DiscoveryServiceProxy(discoveryServiceUri, null, clientCredentials, clientCredentials))
        {
            Orgs = DiscoverOrganizations(ServiceProxy);
            Org = FindOrganization(Orgs);
            Organization = Org.UniqueName;
        }
    }

    private OrganizationDetailCollection DiscoverOrganizations(IDiscoveryService service)
    {
        try
        {
            OrgRequest = new RetrieveOrganizationsRequest();
            OrgResponse = (RetrieveOrganizationsResponse)service.Execute(OrgRequest);
            return OrgResponse.Details;
        }
        catch (FaultException<OrganizationServiceFault>)
        {
            throw;
        }
    }

    private OrganizationDetail FindOrganization(OrganizationDetailCollection orgDetails)
    {
        try
        {
            orgDetail = null;
            foreach (OrganizationDetail detail in orgDetails)
            {
                if (String.Compare(detail.UniqueName, Organization, CultureInfo.CurrentCulture, CompareOptions.None) == 0)
                {
                    orgDetail = detail;
                    break;
                }
                if (String.Compare(detail.FriendlyName, Organization, CultureInfo.CurrentCulture, CompareOptions.None) == 0)
                {
                    orgDetail = detail;
                    break;
                }
            }
            return orgDetail;
        }
        catch (FaultException<OrganizationServiceFault>)
        {
            throw;
        }
    }

    private void InstantiateConnection()
    {
        Connection = new CrmConnection();
        string connectionString = string.Format(CultureInfo.CurrentCulture, "Url={0}://{1}/{2}", Scheme, DiscoveryServer, Organization);
        if (!string.IsNullOrEmpty(Port))
        {
            connectionString = string.Format(CultureInfo.CurrentCulture, "Url={0}://{1}:{2}/{3}", Scheme, DiscoveryServer, Port, Organization);
        }
        if (!string.IsNullOrEmpty(Domain))
        {
            connectionString = string.Format(CultureInfo.CurrentCulture, "{0}; Domain={1}", connectionString, Domain);
        }
        if (!string.IsNullOrEmpty(UserName))
        {
            connectionString = string.Format(CultureInfo.CurrentCulture, "{0}; Username={1}", connectionString, UserName);
        }
        if (!string.IsNullOrEmpty(Password))
        {
            connectionString = string.Format(CultureInfo.CurrentCulture, "{0}; Password={1}", connectionString, Password);
        }
        Connection = CrmConnection.Parse(connectionString);
        if (string.IsNullOrEmpty(UserName))
        {
            Connection.ClientCredentials = new ClientCredentials();
            Connection.ClientCredentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials;
        }
        Connection.DeviceCredentials = Connection.ClientCredentials;
    }
}

我怀疑这可能是 DNS 或其他网络问题。任何人都可以帮忙吗?

4

1 回答 1

0

您是仅使用 Import Solution 方法还是同时使用 CreateSolution Method、CreatePublisher 等...????

几个月前,我用导出/导入请求做了一个类似的例子,对我来说效果很好。

http://crmandcoffee.wordpress.com/2013/05/22/import-export-dynamics-crm-2011-solutions-through-web-services/

为什么不尝试在单独的控制台应用程序中隔离导入请求,从硬盘驱动器获取解决方案并测试端点?也许您会发现导入工作正常,但您使用解决方案类创建的解决方案不正确。

我建议这样做,因为如果您可以导航到组织 URL,那应该绝对没问题。

请发布您的答案,我正在制定一个框架来自己处理解决方案,我对您的问题非常感兴趣;)

谢谢,

马里奥

于 2013-07-08T13:14:58.613 回答