ProtocolException: входящая транзакция не может быть десериализована

У меня есть простая служба WCF, работающая в разных средах. Сегодня я попытался запустить его на своей рабочей станции Windows 7 и получил эту ошибку на моем клиенте (это простое консольное приложение для тестирования):

System.ServiceModel.ProtocolException: входящая транзакция не может быть десериализована. Заголовок транзакции в сообщении был неверно сформирован или не распознан. Клиент и служба должны быть настроены на использование одного и того же протокола и версии протокола. Произошло следующее исключение: сбой связи с нижележащим менеджером транзакций.

Server stack trace: 
    at System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(Message reply, MessageFault fault, String action, MessageVersion version, FaultConverter faultConverter)
    at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc)
    at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
    at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
    at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]: 
    at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
    at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
    at ConsoleApplication1.ServiceReference1.ILookupService.GetMaritalStatus()
    at ConsoleApplication1.ServiceReference1.LookupServiceClient.GetMaritalStatus() in D:\\Temp\\ConsoleApplication1\\ConsoleApplication1\\Service References\\ServiceReference1\\Reference.cs:line 46975
    at ConsoleApplication1.Program.Main(String[] args) in D:\\Temp\\ConsoleApplication1\\ConsoleApplication1\\Program.cs:line 24

Если я изменяю конечную точку на клиенте для вызова той же службы из любой другой среды - она ​​работает просто отлично. Я уверен, что что-то не так с моей рабочей станцией, но не могу понять, что это такое. Все настройки в IIS такие же, как и на других серверах. Другие сервисы прекрасно работают на рабочей станции.

Договор на обслуживание выглядит так:

[ServiceContract]
public interface IMyService
{
    [OperationContract]
    [TransactionFlow(TransactionFlowOption.Allowed)]
    [FaultContract(typeof(ServiceFault))]
    Result MethodName(Guid id);        
}

Реализация:

[ServiceBehavior(Name = "MyService", InstanceContextMode = InstanceContextMode.PerCall)]
public class MyService : IMyService
{
    public Result MethodName(Guid id)
    {
        ...
    }
}

Я не создал этот сервис и не уверен, почему нам может понадобиться атрибут TransactionFlow. Это вызывает проблему. Как я могу это исправить?

Скрипач показал следующий ответ. Ничего, что могло бы помочь.

HTTP/1.1 500 Internal Server Error
Content-Length: 905
Content-Type: application/soap+xml; charset=utf-8
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Wed, 08 Jan 2014 18:45:33 GMT

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing"><s:Header><a:Action s:mustUnderstand="1">http://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/transactions/fault</a:Action></s:Header><s:Body><s:Fault><s:Code><s:Value>s:Sender</s:Value><s:Subcode><s:Value xmlns:a="http://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/transactions">a:TransactionHeaderMalformed</s:Value></s:Subcode></s:Code><s:Reason><s:Text xml:lang="en-US">The incoming transaction cannot be deserialized. The transaction header in the message was either malformed or in an unrecognized format. The client and the service must be configured to use the same protocol and protocol version. The following exception occurred: Communication with the underlying transaction manager has failed.</s:Text></s:Reason></s:Fault></s:Body></s:Envelope>

1 ответ

Похоже, что настройки безопасности MSDTC были сброшены обновлениями Windows. Я нашел следующие записи журнала в журналах Windows:

MSDTC encountered an error (HR=0x80000171) while attempting to establish a secure connection with system <HostName>.

Итак, я сделал две вещи:

1) Предоставлен полный доступ к NetworkServices для msdtc.log:

icacls c:\windows\system32\msdtc\msdtc.log /grant "networkservice":F 

2) Изменены параметры безопасности для локального кода неисправности (Панель управления -> Администрирование -> Службы компонентов -> Мой компьютер -> Координатор распределенных транзакций -> Локальный код неисправности -> Свойства). Я установил следующее (ничего не было установлено):

Местные права DTC -> Безопасность Безопасность">

Другие вопросы по тегам