Как использовать MSMQ в WCF?
-
03-10-2019 - |
Вопрос
Я могу работать со многими привязаниями WCF, кроме netMsmqBinding
. Отказ Все, что я получаю:
CommunicationObjectFaultedException: «Объект связи, System.ServiceModel.servicehost, не может быть использован для связи, потому что он находится в неисправном состоянии».
На System.Servicemodel.Channels.comMUnicateObject.Close (Timepan Timeout)
Я попробовал его в Windows Server 2008 R2 с установленными следующими функциями
- Очередь сообщений
- Услуги по очереди сообщений
- Сервера очереди сообщений
- Триггеры в очереди сообщений
- Поддержка http.
- Поддержка многосуточной обработки
- Очередь сообщений DCOM Proxy
Я также попробовал добавить вручную личную очередь сообщений в диспетчере сервера, но он не работал.
Я использую службу 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 { get; set; }
[DataMember(IsRequired = false)]
public int? Category { get; set; }
}
}
И мое приложение.config содержит
<endpoint
address="net.msmq://localhost/private/ServiceName"
binding="netMsmqBinding"
contract="MyCompany.Services.IServiceName"
bindingConfiguration="tolerant"
behaviorConfiguration="tolerant"
/>
а также
<netMsmqBinding>
<binding name="tolerant"
maxReceivedMessageSize="2147483647"
>
<readerQuotas maxArrayLength="2147483647" />
<security mode="None"/>
</binding>
</netMsmqBinding>
Решение
Лучшая отправная точка будет Tom Hollander's Thread Blog Post:
- MSMQ, WCF и IIS: заставить их играть в приятно (часть 1)
- MSMQ, WCF и IIS: заставить их играть в приятно (часть 2)
- MSMQ, WCF и IIS: заставить их играть в приятно (часть 3)
и хорошо посмотрите на MSDN Docs On Очереди в WCF. - Много вещей тоже!
Ошибка, которую вы получаете, будет указывать на некоторую проблему с каналом связи - что-то пошло не так, канал был «неисправным», т.е. незаместил. Есть тонна причин, которые могут произойти, это действительно трудно диагностировать издалека вдали вдалью любую информацию.
Проверьте ресурсы и посмотрите, что это поможет вам еще один шаг или два - если нет, нам придется получить намного больше информации от вас!