我有从net 3.5移植的.net 4.0应用程序,它使用在服务器2008 x64上运行的net.msmq
建立
现在一切都在使用.net 3.5进行生产.
我在服务器上安装了.net 4.0并创建了新站点以便在同一个盒子上进行暂存.
新的暂存msmq设置是
为不同的站点创建了另一个队列.
我用新网站做的另一个变化是,这是iis中不同的网站,可以监听不同的IP地址.我已将net.msmq绑定到'localhost'.主站点以及net.msmq - >'localhost'具有相同的绑定.我认为应该是这样的.请指出是否需要一些不同的配置.
问题是我的请求正在进入队列但没有被应用程序接收它只是停留在那里
日志中没有任何错误迹象.我在日志中看到的与此相关的事情是警告"msmqactivation无法发现队列".虽然这个警告我从来没有正确理解,因为我们已经看到这总是与3.5中的msmq一切都很好.
我能想到的任何东西都经过验证,而且是正确的.
摘要
请使用net.msmq提供有关多个站点设置的任何信息.我正在为两个站点使用net.msmq绑定值='localhost'.我认为这是机器名称.
有什么方法可以诊断这个问题吗?
您可能想到的任何其他事情都可能有所帮助.
昨天我们不得不推迟释放,因为花了100个工时我们无法弄清问题是什么.也不能让它在我的开发机器中破碎.
编辑
问题是在创建新站点命名约定后不起作用
net.msmq服务地址为"net.msmq://localhost/private/staging/msmqdataservice.svc"net.msmq endpoing,地址为MSMQ中的"net.msmq://localhost/private/staging/msmqdataservice.svc"队列 - > name ="$ private\staging/msmqdataservice.svc"
它使用服务名称net.msmq://localhost/private/msmqdataservice.svc
但现在我不能让两个站点使用完全相同的端点.
在同一台机器上的不同url和不同队列的两个不同站点中有相同端点的方法吗?
我在服务器THOR上设置了事务性MSMQ队列.我可以使用以下代码从工作站向该队列发送消息:
var queue = new MessageQueue("FormatName:Direct=OS:thor\\private\\myqueue");
using (var tx = new MessageQueueTransaction())
{
tx.Begin();
queue.Send("test", tx);
tx.Commit();
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用WCF进行连接时,我的消息永远不会出现在队列中.这是我正在使用的配置:
<system.serviceModel>
<bindings>
<netMsmqBinding>
<binding name="ClientNewsFeedServiceBinding" durable="true" exactlyOnce="true">
<security mode="None" />
</binding>
</netMsmqBinding>
</bindings>
<client>
<!-- NewsFeed Service -->
<endpoint name="INewsFeedService"
address="net.msmq://thor/private/myqueue"
binding="netMsmqBinding"
bindingConfiguration="ClientNewsFeedServiceBinding"
contract="Service.Contract.INewsFeedService" />
</client>
</system.serviceModel>
Run Code Online (Sandbox Code Playgroud)
和代码:
using (var tx = new TransactionScope())
{
var cf = new ChannelFactory<INewsFeedService>("INewsFeedService");
var service = cf.CreateChannel();
service.TestMessage("test");
((IChannel)service).Close();
tx.Complete();
}
Run Code Online (Sandbox Code Playgroud)
我没有任何例外,但是在THOR队列中没有发布消息.有任何想法吗?我甚至不知道如何调试它,因为它只是默默地失败.
UPDATE
如果我将我的MSMQ URI更改为'net.msmq:// localhost/private/myqueue',那么它将发布到我已设置的本地事务队列.队列本身的设置是相同的(例如,我执行相同的步骤来创建localhost和THOR队列).
我们有一个过去工作的设置,并在过去几个月的某个时间停止了.我们使用在config中指定的自定义死信队列,但基本上设置如下::
MsmqIntegrationBinding msmq = new MsmqIntegrationBinding(
// Defaults to WindowsDomain. We want all messages to be authenticated.
MsmqIntegrationSecurityMode.Transport);
msmq.DeadLetterQueue = DeadLetterQueue.Custom;
msmq.CustomDeadLetterQueue = new Uri("net.msmq://localhost/private/BulkUpdatesDeadLetter");
Run Code Online (Sandbox Code Playgroud)
我们已经开始收到此错误,这似乎很清楚:
System.InvalidOperationException:绑定和MSMQ配置之间发生不匹配.无法发送消息.绑定中指定的自定义死信队列必须是事务性队列.确保自定义死信队列地址正确且队列是事务性队列.
我们已经验证了我们指向配置中的正确队列并且队列是事务性的.是否有任何其他问题可能会导致抛出此异常,或者我们是否只是遗漏了明显的内容?
更新:我们的Web操作团队是否删除并重新创建队列并仍然收到错误.
有没有办法检查公共MSMQ是否为空?对于私人MSMQ,这很容易:
private bool IsQueueEmpty(string path)
{
bool isQueueEmpty = false;
var myQueue = new MessageQueue(path);
try
{
myQueue.Peek(new TimeSpan(0));
isQueueEmpty = false;
}
catch (MessageQueueException e)
{
if (e.MessageQueueErrorCode == MessageQueueErrorCode.IOTimeout)
{
isQueueEmpty = true;
}
}
return isQueueEmpty;
}
Run Code Online (Sandbox Code Playgroud)
我如何对公共MSMQ进行同样的检查?如果我尝试使用上面的代码检查一个公共MSMQ,它会在峰值上给我一个错误:
System.ArgumentOutOfRangeException:Length不能小于零.
我必须在 WCF 服务中获得最大吞吐量性能。在我的一项测试中,下面的服务使用 NetTcpBinding 每分钟仅获取 50k 数据项。像 NetMsmqBinding 这样的断开连接会提高性能吗?
服务和客户端使用WCF并运行在同一台机器上。
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
ConcurrencyMode = ConcurrencyMode.Multiple)]
public class Storage : IStorage
{
protected List<int> _data = new List<int>();
public void Insert(int[] data)
{
lock (_data)
{
_data.AddRange(data);
}
}
public int[] Get()
{
lock (_data)
{
return _data.ToArray();
}
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码是实际代码的简化版本。
我尝试将消息放入本地计算机上定义的专用队列中,但队列大小不能超过 8 MB。每次达到该大小后我都会遇到异常。特定队列的大小设置为 10 GB。我运行的是 Windows 7 专业版。是否因此而受到限制?
我可以使用许多WCF绑定,除了netMsmqBinding
.我得到的只是:
CommunicationObjectFaultedException:"通信对象System.ServiceModel.ServiceHost不能用于通信,因为它处于Faulted状态."
在System.ServiceModel.Channels.CommunicationObject.Close(TimeSpan超时)
我在安装了以下功能的Windows Server 2008 R2中尝试过它
我还尝试在服务器管理器中手动添加私有消息队列,但它不起作用.
我正在使用Windows服务来托管我的MSMQ.我的服务合同是
namespace MyCompany.Services
{
[ServiceContract(Name = "ServiceName",
Namespace = "http://MyCompany/ServiceName")]
public interface IServiceName
{
[OperationContract(IsOneWay = true)]
void Insert(MyData[] data);
}
[DataContract]
public class MyData
{
[DataMember]
public DateTime DateTime { get; set; }
[DataMember]
public double Lat { get; set; }
[DataMember]
public double Lon { get; set; }
[DataMember]
public TimeSpan Timespan { get; set; }
[DataMember]
public Guid Id { …
Run Code Online (Sandbox Code Playgroud) 我想使用WCF + MSMQ(netMsmqBinding),我想知道我是否需要在客户端安装任何与MSMQ相关的东西,而不是我的客户端应用程序和.NET框架.
我们有一个使用MsmqBinding和WAS的WCF日志服务.问题是我尝试从远程计算机使用它,并且该消息似乎永远不会到达目标队列.以下是事实:
而且价值是:
var queue = new MessageQueue(@"FormatName:DIRECT=OS:logserver.domain.ext\private$\logservice.svc");
queue.Send("hello");
Run Code Online (Sandbox Code Playgroud)
工作!