Сбой размещения службы WCF при использовании привязки netMsmqBinding с размещением IIS

Служба WCF при размещении с помощью IIS дает сбой. Web.config для службы

<system.serviceModel>
    <bindings>
        <netMsmqBinding>
            <binding name="msmqbindingnontransactionalnonsecure" exactlyOnce="False">
                <security mode="None" />
            </binding>
        </netMsmqBinding>
    </bindings>
    <services>
        <service name="MsmqService.MsmqService">
            <endpoint address="net.msmq://localhost/private/msmqpoc/MsmqService.svc"  binding="netMsmqBinding" bindingConfiguration="msmqbindingnontransactionalnonsecure" contract="MsmqWCFService.IMsmqContract" />
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior>
                <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
                <serviceMetadata httpGetEnabled="true"/>
                <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
                <serviceDebug includeExceptionDetailInFaults="false"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>

Договор на обслуживание есть

[ServiceContract]
public interface IMsmqContract
{
    [OperationContract(IsOneWay = true)]
    void SendMessage(string message);
}

При размещении службы в IIS отображается следующее сообщение:

Server Error in '/msmqpoc' Application.
--------------------------------------------------------------------------------

Binding validation failed because the binding's ExactlyOnce property is set to true while the destination queue is non-transactional. The service host cannot be opened. Resolve this conflict by setting the ExactlyOnce property to false or creating a transactional queue for this binding. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.InvalidOperationException: Binding validation failed because the binding's ExactlyOnce property is set to true while the destination queue is non-transactional. The service host cannot be opened. Resolve this conflict by setting the ExactlyOnce property to false or creating a transactional queue for this binding.

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.      
Stack Trace:
[InvalidOperationException: Binding validation failed because the binding's ExactlyOnce property is set to true while the destination queue is non-transactional. The service host cannot be opened. Resolve this conflict by setting the ExactlyOnce property to false or creating a transactional queue for this binding.]

Конфигурация уже установлена ​​точноOnce=false, не знаю, почему возникает эта ошибка, любая помощь?


person user457485    schedule 17.03.2012    source источник
comment
Есть ли причина, по которой вы используете нетранзакционные очереди?   -  person tom redfern    schedule 18.03.2012
comment
Это просто тестовая работа, план состоит в том, чтобы заставить нетранзакционную очередь работать, после чего очередь будет изменена на транзакционную и безопасную.   -  person user457485    schedule 19.03.2012


Ответы (1)


Я могу только предположить, что ваш сервис не получает правильный файл конфигурации. Я бы предложил дважды проверить это. Я не вижу никаких проблем с файлом конфигурации, который вы разместили.

Немного не по теме, рискну предположить, что вы должны подумать, почему вы используете нетранзакционные очереди. Единственная причина, по которой вы будете их использовать, заключается в том, что ваша общая архитектура может выдерживать потерю сообщений.

Например, в некоторых системах с малой задержкой сообщения ценны не более нескольких секунд, прежде чем они станут недействительными. Таким образом, в этом случае вам не нужно будет использовать транзакционные очереди.

Если вы не можете допустить потери сообщений, вы должны использовать транзакционную очередь.

person tom redfern    schedule 18.03.2012
comment
Спасибо, именно так и было. Служба не подхватывала указанную конфигурацию, не знаю почему. Я изменил конфигурацию и удалил имя привязки, после чего служба заработала как положено. - person user457485; 19.03.2012
comment
Хью - Нетранзакционные очереди являются законным вариантом точно так же, как и UDP. Попытка предложить здесь наилучшую практику, подходящую для всех сценариев, не зная намерения OP, бесполезна. - person MickyD; 10.04.2014
comment
@MickyDuncan спасибо за комментарий. Согласитесь, что нетранзакционный вариант является законным, поэтому я уточнил свое предположение (что OP было бы лучше использовать транзакционную очередь) с примером того, где это не понадобится. Из преимуществ очередей в целом именно долговечность люди находят наиболее привлекательной. Я бы предположил, что у большинства людей (когда они начинают использовать очереди) есть встроенное ожидание долговечности — я знаю, что у меня было. Без использования DTC MSMQ просто не может обеспечить надежность. Итак, наоборот, я считаю, что указание на это ОП полезно в этом случае. - person tom redfern; 10.04.2014
comment
Согласованный. Что мне нравится в MSMQ, или, если уж на то пошло, в обмене сообщениями, так это превосходная масштабируемость по сравнению с альтернативами RPC. Можно сказать, бесплатный набор ножей для стейков. ;) - person MickyD; 10.04.2014