在我的控制台应用程序中,我在app.config
上有这个 <appSettings>
<add key="Microsoft.ServiceBus.ConnectionString" value="Endpoint=sb://xx.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=xx/KrM="/>
</appSettings>
控制台应用程序执行以下操作:
static void Main(string[] args)
{
try
{
Console.WriteLine("Press key to continue");
Console.ReadKey();
QueueHelper.ReceiveMessage("Empresa");
}
catch (Exception ex)
{
throw ex;
}
}
但是我想在不同的类库中隔离Queing方法,所以ReceiveMessage的实际实现在另一个类库中
/// <summary>
/// Receives a message
/// </summary>
/// <param name="queuName"></param>
public static void ReceiveMessage(string queuName)
{
QueueClient Client = QueueClient.CreateFromConnectionString(connectionString, "Empresa");
// Configure the callback options
OnMessageOptions options = new OnMessageOptions();
options.AutoComplete = false;
options.AutoRenewTimeout = TimeSpan.FromMinutes(1);
// Callback to handle received messages
Client.OnMessage((message) =>
{
try
{
Empresa empresa = GetBody<Empresa>(message);
// Process message from queue
//Console.WriteLine("Body: " + );
Console.WriteLine("MessageID: " + message.MessageId);
// Remove message from queue
message.Complete();
}
catch (Exception ex)
{
// Indicates a problem, unlock message in queue
message.Abandon();
}
}, options);
}
问题是它试图从app.config获取连接字符串信息,该信息是该库的本地而不是调用者。
所以我得到一个空连接字符串。
现在,我不想在我的类库项目中复制应用程序设置,如何以及实现此目的的最佳方法是什么?
其中一个原因是,最终这个控制台应用程序将作为WebJob安装在Azure中,而Azure有一个界面可以更改Webjobs的AppSettings,但不能用于类库。
答案 0 :(得分:1)
使用反射,您可以从调用程序集中获取应用程序配置。
以下是示例代码
public static void ReceiveMessage(string queuName)
{
var assembly = Assembly.GetCallingAssembly();
string configPath = new Uri(assembly.CodeBase).LocalPath;
var configManager = ConfigurationManager.OpenExeConfiguration(configPath);
var connectionString = configManager.ConnectionStrings.CurrentConfiguration.AppSettings.Settings["Microsoft.ServiceBus.ConnectionString"];
QueueClient Client = QueueClient.CreateFromConnectionString(connectionString, "Empresa");
// Configure the callback options
OnMessageOptions options = new OnMessageOptions();
options.AutoComplete = false;
options.AutoRenewTimeout = TimeSpan.FromMinutes(1);
// Callback to handle received messages
Client.OnMessage((message) =>
{
try
{
Empresa empresa = GetBody(message);
// Process message from queue
//Console.WriteLine("Body: " + );
Console.WriteLine("MessageID: " + message.MessageId);
// Remove message from queue
message.Complete();
}
catch (Exception ex)
{
// Indicates a problem, unlock message in queue
message.Abandon();
}
}, options);
}
ConfigurationManager
是System.Configuration
汇编的一部分。
如果您有更复杂的情况,请发布详细信息,我会尝试找出解决方案。