none
Непонятные глюки с безопасностью в WCF RRS feed

  • Общие обсуждения

  • Есть WCF-сервис, который работает отлично на тестах - когда странички, расположенные в том же узле формируют запросы к этому сервису. Но как только начинаются реальные запросы из внешнего узла - получается ошибка:

    The message with Action 'PaymentContract' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver. Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None).

    Что за АДСКОЕ сообщение - в чем его смысл? Как это иcправить? Я описывал эту ситуация на нескольких форумах существенно подробнее, например - http://www.sql.ru/forum/actualthread.aspx?tid=881463 - никто ДАЖЕ ПРЕДПОЛОЖИТЬ не в состоянии - что же там в WCF могло быть накручено эдакое, что проверило что-то только ему понятное и выругалось вот этой ошибкой.


    21 сентября 2011 г. 8:33

Все ответы

  • Уважаемый пользователь!

    В вашей теме отсутствует активность в течение последних 5 дней. При отсутствии каких-либо действий в течение 2 последующих дней, тема будет переведена в разряд обсуждений. Вы можете возобновить дискуссию, просто оставив сообщение в данной теме


    Для связи [mail]
    25 сентября 2011 г. 21:42
  • Выложите полный код сервисного контракта, возможно в нем проблема.
    6 октября 2011 г. 16:29
  • интерфейс выглядит вот так:

     

    <ServiceContract(ProtectionLevel:=Net.Security.ProtectionLevel.None)>
    Public Interface IInPlatGateway

        <OperationContract()>
        Function TST(ByVal value As Integer) As String

        <OperationContract()>
        Sub PaymentCancellation(ByVal PaymentID As String, _
                                     ByVal PaymentResult As Integer, _
                                     ByVal PaymentResultStr As String, _
                                     ByVal PayeeRegData As String, _
                                     ByVal PayeeRegDataEx As String, _
                                     ByVal ShopParams As String, _
                                     ByVal Demo As Boolean)

        <OperationContract()>
        Sub PaymentContract(ByVal PaymentID As String, _
                                 ByVal Account As String, _
                                 ByVal Currency As Integer, _
                                 ByVal PaymentTime As Date, _
                                 ByVal PayerAddress As String, _
                                 ByVal ShopParams As String, _
                                 ByVal UserParams As String, _
                                 ByVal Demo As Boolean, _
                                 ByRef Sum As Single, _
                                 ByRef PayeeRegData As String, _
                                 ByRef Contract As String, _
                                 ByRef PaymentDelay As Integer)

        <OperationContract()>
        Sub PaymentAuthorization( _
                        ByVal PaymentID As String, _
                        ByVal PayeeRegData As String, _
                        ByRef PayeeRegDataEx As String, _
                        ByVal PaymentTime As Date, _
                        ByVal Currency As Integer, _
                        ByVal Sum As Single, _
                        ByVal CreditSum As Single, _
                        ByVal Account As String, _
                        ByVal AccountEstimatedSum As Single, _
                        ByVal PayerAccount As String, _
                        ByVal AuthorizationTime As Date, _
                        ByVal IsRepeat As Boolean, _
                        ByVal ShopParams As String, _
                        ByVal Demo As Boolean, _
                        ByRef ReplyResource As String, _
                        ByRef ReplyResourceIsFailure As Boolean, _
                        ByRef ShopTime As Date)

        <OperationContract()>
        Sub ArbitraryMessage(ByVal MessageType As String, _
                                  ByVal Message As String, _
                                  ByVal ShopParams As String, _
                                  ByRef ResponseMessage As String)

    End Interface

     

    реализация ошибок не имеет - WCF УДАЧНО тестируется ЧЕТЫРЬМЯ видами клиентов:

    1. Встроенный клиент из студии

    2. Альтовой.

    3. Все удачно работает из Flex

    4. Я могу вызвать свой WCF-сервис из собственных страничек

    однако, когда настоящий клиент (на PHP) вызывает мой WCF - возникает ошибка

    трассировка (скрин выложен на SQL.RU - ссылка выше) - показала РАЗЛИЧИЕ запроса, который формирует ЛЮБОЙ из указанных четырех механизмов с запросом, который сформировала среда PHP

    то есть ВОЗМОЖНО, это сообщение возникается не из-за безопасности

    в частности отличается SoapAction и namespace - проблема так и не решилась - что поменять, как подгадать чтобы нормально отработала среда PHP - я не знаю


    6 октября 2011 г. 20:14
  • Сейчас клиент на PHP присылает запрос с несуществующей (с точки зрения сервера) операцией. Можно попробовать поменять на сервере биндинг с basicHttpBinding на кастомный, подсунув ему свой селектор операций. Пример есть на http://msdn.microsoft.com/en-us/library/aa967564.aspx, UriPathSuffixOperationSelector. 
    6 октября 2011 г. 21:02
  • сегодня опять вернулся к этой нерешенной проблеме

    кажется я начинаю понимать в чем дело

    у меня действительно контракт моей WCF не в точности совпадает с тем, что присылает настоящий клиент на PHP

    видимо, Альтова, FLEX и конечно сама микрософтовская среда ASP.NET - они вычитывают WSDL, они понимают все возможности WCF, а PHP работает тупо - игнорируя мой WSDL суется ко мне сразу со своим запросом

    а в моей WSDL есть тонкие отличия (например NameSpace) - но PHP не читало мой WSDL, не ждет таких неймспейсов как у меня есть в реале и от этого получается неизвестная для моего сервиса операция

    я сейчас сгенерил интерфейс с помощью SVCUTIL полностью по такому сервису, который понимает PHP - и сейчас делаю его реализацию

    надеюсь когда PHP сунется в этот сервис - все будет отлично

    6 октября 2011 г. 21:37