C# 将可序列化对象返回biztalk时数据丢失
我的项目有一个编排,它包含一个非事务范围 在该范围内,有一个对.NET helper的调用,以获取一个带有值的C# 将可序列化对象返回biztalk时数据丢失,c#,.net,serialization,biztalk,biztalk-2010,C#,.net,Serialization,Biztalk,Biztalk 2010,我的项目有一个编排,它包含一个非事务范围 在该范围内,有一个对.NET helper的调用,以获取一个带有值的哈希表 必须指出的是,这是我在该范围内执行的唯一的事情,这意味着该范围只包含调用.NET函数的表达式形状 返回哈希表的函数被标记为静态 看起来是这样的: public static Hashtable GetKeys(XmlDocument xmlDoc) { Hashtable servicesKey = new Hashtable();
哈希表
必须指出的是,这是我在该范围内执行的唯一的事情,这意味着该范围只包含调用.NET函数的表达式形状
返回哈希表
的函数被标记为静态
看起来是这样的:
public static Hashtable GetKeys(XmlDocument xmlDoc)
{
Hashtable servicesKey = new Hashtable();
//Key1
int keysCounter = 1;
// Add key1
servicesKey.Add("Key" + keysCounter, Constants.Keys.First);
keysCounter++;
// Add key2
servicesKey.Add("Key" + keysCounter, Constants.Keys.Second);
keysCounter++;
// Add key3
servicesKey.Add("Key" + keysCounter, Constants.Keys.Third);
keysCounter++;
return servicesKey;
}
由于某种原因,当发送大量消息并同时重新启动主机实例时-我在部分消息上得到一个空的哈希表
是否有人可以帮助我更改它,以便在这种情况下消息不会丢失?您需要正确序列化类,以确保数据正确保存
首先,您需要为类提供可序列化标记:
[Serializable]
public class MyClass
{
public Hashtable GetKeys(XmlDocument xmlDoc)
{
// etc...
}
}
然后需要在编排中实例化它的一个实例。为此,您可以创建一个变量并为其指定类的类型(必须使用业务流程引用biztalk项目中包含该类的程序集)
然后可以在表达式形状中声明新实例:
// In an expression shape:
MyOrchestrationVariable = new MyExternalAssembly.MyClass();
并安全地调用您的方法:
// In an expression shape again:
ServicesKey = MyOrchestrationVariable.GetKeys(XmlDoc);
希望这有帮助。我不明白,这意味着什么,重新启动主机实例。提交消息后是否重新启动主机实例?为什么会这样
关于返回空的hashtags,请尝试在控制台应用程序中单独测试该代码,并查看它在“大量消息”中的行为。
另一个建议是,将您的流程设计为每个消息(在mass中)都创建新的Orch实例,因此也将单独实例化.NET类。我不是专家,但我认为这里的问题可能是持久性。我怀疑当实例在GetKeys方法中时可能会发生数据丢失。您可以在.Net helper调用之前通过调用一个空Orch来强制一个持久性点吗?有关持久性点,请参见此处: