Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有办法通过代码自动打开或关闭BizTalk接收位置?_C#_Biztalk_Biztalk2006r2 - Fatal编程技术网

C# 有没有办法通过代码自动打开或关闭BizTalk接收位置?

C# 有没有办法通过代码自动打开或关闭BizTalk接收位置?,c#,biztalk,biztalk2006r2,C#,Biztalk,Biztalk2006r2,是否有一种方法可以自动打开或关闭BizTalk中的接收位置?似乎应该有某种API或类似的API来解决这类问题。我更喜欢在C#中工作,但WMI或某种脚本也可以工作。我找到了一个解决方案。看起来Microsoft.BizTalk.Explorer.dll正是我想要的。以下是BizTalk文档的摘录,其他人可以从中开始: using System; using Microsoft.BizTalk.ExplorerOM; public static void EnumerateOrchestration

是否有一种方法可以自动打开或关闭BizTalk中的接收位置?似乎应该有某种API或类似的API来解决这类问题。我更喜欢在C#中工作,但WMI或某种脚本也可以工作。

我找到了一个解决方案。看起来Microsoft.BizTalk.Explorer.dll正是我想要的。以下是BizTalk文档的摘录,其他人可以从中开始:

using System;
using Microsoft.BizTalk.ExplorerOM;
public static void EnumerateOrchestrationArtifacts()
{
    // Connect to the local BizTalk Management database
    BtsCatalogExplorer catalog = new BtsCatalogExplorer();
    catalog.ConnectionString = "Server=.;Initial Catalog=BizTalkMgmtDb;Integrated Security=SSPI;";

    // Enumerate all orchestrations and their ports/roles
    Console.WriteLine("ORCHESTRATIONS: ");
    foreach(BtsAssembly assembly in catalog.Assemblies)
    {
        foreach(BtsOrchestration orch in assembly.Orchestrations)
        {

            Console.WriteLine(" Name:{0}\r\n Host:{1}\r\n Status:{2}",
                orch.FullName, orch.Host.Name, orch.Status);

            // Enumerate ports and operations
            foreach(OrchestrationPort port in orch.Ports)
            {
                Console.WriteLine("\t{0} ({1})", 
                    port.Name, port.PortType.FullName);

                foreach(PortTypeOperation operation in port.PortType.Operations)
                {
                    Console.WriteLine("\t\t" + operation.Name);
                }
            }

            // Enumerate used roles
            foreach(Role role in orch.UsedRoles)
            {
                Console.WriteLine("\t{0} ({1})", 
                    role.Name, role.ServiceLinkType);

                foreach(EnlistedParty enlistedparty in role.EnlistedParties)
                {
                    Console.WriteLine("\t\t" + enlistedparty.Party.Name);
                }
            }

            // Enumerate implemented roles
            foreach(Role role in orch.ImplementedRoles)
            {
                Console.WriteLine("\t{0} ({1})", 
                    role.Name, role.ServiceLinkType);
            }
        }
    }
}

一个警告,显然这个dll不支持64位。由于我只编写了一个简单的实用程序,这对我来说没什么大不了的(只是编译为32位),但这是需要注意的。

除了ExplorerOM,正如您所发现的,您还可以使用WMI启用/禁用接收位置(和控制发送端口)


如果您感兴趣的话,我有一个示例PowerShell脚本,演示如何做这些事情。

回应Alhambraeidos的评论。以下是我在Windows应用程序中用于远程禁用接收位置的代码摘录:

    /// <summary>
    /// Gets or sets the biz talk catalog.
    /// </summary>
    /// <value>The biz talk catalog.</value>
    private BtsCatalogExplorer BizTalkCatalog { get; set; }

    /// <summary>
    /// Initializes the biz talk artifacts.
    /// </summary>
    private void InitializeBizTalkCatalogExplorer()
    {
        // Connect to the local BizTalk Management database
        BizTalkCatalog = new BtsCatalogExplorer();
        BizTalkCatalog.ConnectionString = "server=BiztalkDbServer;database=BizTalkMgmtDb;integrated security=true";
    }


    /// <summary>
    /// Gets the location from biz talk.
    /// </summary>
    /// <param name="locationName">Name of the location.</param>
    /// <returns></returns>
    private ReceiveLocation GetLocationFromBizTalk(string locationName)
    {
        ReceivePortCollection receivePorts = BizTalkCatalog.ReceivePorts;
        foreach (ReceivePort port in receivePorts)
        {
            foreach (ReceiveLocation location in port.ReceiveLocations)
            {
                if (location.Name == locationName)
                {
                    return location;
                }
            }
        }

        throw new ApplicationException("The following receive location could not be found in the BizTalk Database: " + locationName);
    }


    /// <summary>
    /// Turns the off receive location.
    /// </summary>
    /// <param name="vendorName">Name of the vendor.</param>
    public void TurnOffReceiveLocation(string vendorName)
    {
        ReceiveLocation location = Locations[vendorName].ReceiveLocation;
        location.Enable = false;
        BizTalkCatalog.SaveChanges();
    }
//
///获取或设置biz talk目录。
/// 
///商务谈话目录。
专用BtsCatalogExplorer BizTalkCatalog{get;set;}
/// 
///初始化biz talk工件。
/// 
私有void初始化EBIzTalkCatalogExplorer()
{
//连接到本地BizTalk管理数据库
BizTalkCatalog=new BtsCatalogExplorer();
BizTalkCatalog.ConnectionString=“服务器=BiztalkDbServer;数据库=BizTalkMgmtDb;集成安全性=true”;
}
/// 
///从biz talk获取位置。
/// 
///位置的名称。
/// 
private ReceiveLocation GetLocationFromBizTalk(字符串locationName)
{
ReceivePortCollection receivePorts=BizTalkCatalog.receivePorts;
foreach(接收端口中的接收端口)
{
foreach(端口中的ReceiveLocation位置。ReceiveLocations)
{
if(location.Name==locationName)
{
返回位置;
}
}
}
抛出新的ApplicationException(“在BizTalk数据库中找不到以下接收位置:“+locationName”);
}
/// 
///关闭接收位置。
/// 
///供应商名称。
公共无效关闭接收位置(字符串vendorName)
{
ReceiveLocation=位置[vendorName]。ReceiveLocation;
location.Enable=false;
BizTalkCatalog.SaveChanges();
}

你会注意到我遗漏了一些,比如我在创建一个名为“位置”的接收位置字典,但是你应该能够理解。这种模式对于您想要与之交互的任何BizTalk对象都非常适用。

很高兴看到您似乎找到了解决方案

我想提及一个类似的替代方案,该方案还使用Powershell、ExplorerOM和BizTalk API将BizTalk构件设置为各种状态

接收位置是其中之一

该脚本接受XML配置文件,您可以在其中列出工件以及要将其设置为的状态

脚本已发布到Microsoft脚本中心:

太好了,这绝对有效。选择越多越好。感谢tomasr。我可以使用它远程访问Biztalk Server吗?嗨,Alhambraeidos,如果我理解正确的话,是的,你可以。我用它创建了一个小的windows应用程序,让我选择一个接收位置并将其关闭。