我编写了一个从消息队列中读取的Web服务.这在Cassini下工作正常.
现在我已经在IIS下部署了服务,当服务尝试访问队列时,我收到一条错误消息:
队列不存在或您没有足够的权限来执行操作.
我已将IIS虚拟目录上的匿名访问用户设置为我自己的域帐户,该帐户是本地计算机上管理员组的成员.我已授予此相同用户对队列的完全权限,以及NETWORK SERVICE和ASPNET.
我仍然得到相同的错误消息.
我还尝试禁用虚拟目录上的匿名访问并使用我自己的登录详细信息连接到服务 - 无济于事.
任何有关此问题的帮助将不胜感激!
我也尝试了各种组合:
并且testUsr对队列具有完全权限.我在C:\上的MSMQ商店文件夹中添加了用户和ASPNET的权限
我不确定如何最好地描述这个或最好的标题,所以请耐心等待!
我正在使用MSMQ排队大量命令,这些命令将触发对各种网站和API的HTTP请求.为了避免锤击这些服务(并保持在某些预定义的请求限制内),我需要确保只有在从最后一个请求开始经过最小时间后才能执行命中同一域的任务.
以前我使用数据库对任务进行排队,因此可以执行查询来实现这一目标,但我们使用任务数量快速超过了该解决方案(表上的死锁方式太多).
有没有人对我们采取什么方法有任何建议?我已经考虑过将项目从队列中删除,直到找到一个可以执行的项目 - 但是我意识到没有什么可以阻止队列上的排序,这意味着我们可以在相同的域中取出数千个,然后再找到一个域.
谢谢!
目前我正在开发一个空间数据处理服务器.以下是要求:
目前我已经测试过这种架构:
此外,所有服务都有配置方法和一些通过WCF TCP绑定调用的其他任务.
小的性能测试表明它的工作速度非常快,但我想知道这是将这些MSMQ和WCF一起用于这个特定应用程序的最佳方式.或者也许有人可以给我一个指导方向?
我使用以下代码发送消息:
var transaction = new MessageQueueTransaction())
transaction.Begin( );
var message = new Message
{
Body = myContent,
Recoverable = true
};
m_oMessageQueue.Send( message , myTransaction );
transaction.Commit( );
Run Code Online (Sandbox Code Playgroud)
并使用a BeginRecieve和ReceiveCompleted事件处理程序接收它.
如果我的事件处理程序在调用之前失败EndRecieve,那么该消息是否应保留在队列中并且可用于后续的接收调用?我看到的行为是消息永远消失了.(或者可能会有超时,之后它会再次出现?)
更新接收消息的代码如下所示.
var messageQueue = new MessageQueue( myPath );
messageQueue.ReceiveCompleted += messageQueue_ReceiveCompleted_ThrowException;
messageQueue.BeginReceive();
Run Code Online (Sandbox Code Playgroud)
出于测试目的,我在messageQueue_ReceiveCompleted_ThrowException事件处理程序中抛出异常.
然后我用一个工作事件处理程序重复上面的代码,但我没有被调用.
我有一个关于MSMQ的任务......我设计了一个像这样的异步架构:
CLient - > WCF服务(托管在WinService中) - > MSMQ
所以基本上WCF服务接收请求,处理它们,将它们添加到INPUT队列并返回GUID.相同的WCF服务(通过侦听器)从队列中获取第一条消息(执行某些操作......)然后将其放回另一个队列(OUTPUT).
问题是当客户端请求时,如何从OUTPUT队列中检索结果...因为MSMQ不允许随机访问它的消息,唯一的解决方案是遍历所有消息并将其推回,直到找到我需要的确切一个.我不想在这个OUTPUT队列中使用DB,因为客户端施加了一些限制......
有人能指出一些关于为队列聚类设置MSMQ的好资源吗?我有兴趣帮助:
如果安装了MSMQ,我必须创建一个消息队列.如果未安装MSMQ,则无需执行任何操作即可继续前进.
有没有办法,我们可以发现MSMQ是否安装在MSMQExtension dll中.
我知道,我们可以使用相同的注册表,但如果未安装MSMQ,安装程序将失败.
我正在使用MSMQ端点.我在我的服务上设置了以下属性.
[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
public void MyMethod(MyParam param) { ... }
Run Code Online (Sandbox Code Playgroud)
在我的界面上
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, ReleaseServiceInstanceOnTransactionComplete = true)]
Run Code Online (Sandbox Code Playgroud)
我有一个方法,它更新sql server数据库,并始终使用MSDTC并提升事务.
我该如何压制这个.如何连接到MSMQ事务的完全SEPARATE事务中的sql server.我只想要一个sql事务,而不是DTC事务.有没有办法确保sql事务不包含在MSMQ事务的范围内.
我希望我能做到这一点,而不是在MSMQ上完全删除交易,这正是我正在考虑的问题.
问候
克雷格
所以我的任务是设置MSMQ,这样如果我们的邮件服务器出现故障(这似乎经常发生),消息就会在队列中结束,并在他们重新启动时发送.有了这个说我不得不说除了我在过去24小时里学到的东西之外我对此并不多了但是我相信我知道我采取了正确的方法,但我想问社区中的某个人,因为有一些混乱我的同事在我们的WCF应用程序中给出了一些现有的设置.
目前,我们有一些使用msmq作为端点协议的服务.端点看起来像这样
<endpoint address="net.msmq://localhost/private/Publisher"
behaviorConfiguration="BatchBehaviour"
binding="netMsmqBinding"
bindingConfiguration="MSMQNoSecurity"
contract="HumanArc.Compass.Shared.Publisher.Interfaces.Service.IPublisherSubscriber"
name="PublishSubscriber"/>
Run Code Online (Sandbox Code Playgroud)
这当然允许客户端进行服务呼叫,如果由于某种原因服务未启动,它将确保当服务恢复时,将处理呼叫.我不认为它会做的是你在服务方法中有类似的东西.
try
{
smtp.Send(mail);
return true;
}
catch (System.Net.Mail.SmtpFailedRecipientException ex)
{
throw new Exception("User Credentials for sending the Email are Invalid",ex);
}
catch (System.Net.Mail.SmtpException smtpEx)
{
throw new Exception(string.Format("Application encountered a problem send a mail message to {0} ", smtpHostName),smtpEx);
}
Run Code Online (Sandbox Code Playgroud)
WCF不会重试并以某种方式再次发送消息,我对这个假设是否正确?
我认为我们应该拥有的内容类似于以下代替上面对smtp.send()的调用.(来自http://www.bowu.org/it/microsoft/net/email-asp-net-mvc-msmq-2.html)
string queuePath = @".\private$\WebsiteEmails";
MessageQueue msgQ;
//if this queue doesn't exist we will create it
if(!MessageQueue.Exists(queuePath))
MessageQueue.Create(queuePath);
msgQ = new MessageQueue(queuePath);
msgQ.Formatter = new BinaryMessageFormatter();
msgQ.Send(msg); …Run Code Online (Sandbox Code Playgroud) 我很困惑如何最好地处理这种情况.我不想等待异步调用的响应.具体来说,我有:
public async Task<IApiData> FetchQueuedApiAsync(TimeSpan receiveTimeout)
{
var message = await Task.Factory.FromAsync<Message>(
ReadQueue.BeginReceive(receiveTimeout), ReadQueue.EndReceive);
return message.Body as IApiData;
}
Run Code Online (Sandbox Code Playgroud)
这按预期工作.但是,如果超时到期,则不得调用ReadQueue.EndReceive,否则将引发异常.显然,FromAsync并不知道这一点并盲目地调用它 - 解雇异常.不要在超时时调用EndReceive的要求由MSMQ实现,超出了我的控制范围.
当消息准备就绪或发生超时时,队列会公开事件.这是您通常检查消息是否存在的地方,然后根据文档调用EndReceive.标准听众......
ReadQueue.ReceiveCompleted += ReadQueue_ReceiveCompleted;
Run Code Online (Sandbox Code Playgroud)
我的问题是,我不明白如何做到这一点,仍然有这样的等待(即我希望能够等待我现在,但通过委托处理它).那有意义吗?
msmq ×10
c# ×4
wcf ×3
.net ×1
asp.net ×1
asynchronous ×1
iis ×1
nservicebus ×1
permissions ×1
transactions ×1
web-services ×1
wix ×1
wix3.5 ×1