soapOperationを呼び出すとdispatchOperation.Formatter NULL

wcf
soapOperationを呼び出すとdispatchOperation.Formatter NULL

IDispatchMessageFormatter実装があります

    class ServerMessageFormatter : IDispatchMessageFormatter
{
    private IDispatchMessageFormatter Formatter;

    public ServerMessageFormatter(IDispatchMessageFormatter formatter)
    {
        this.Formatter = formatter;
    }

    public void DeserializeRequest(System.ServiceModel.Channels.Message message, object[] parameters)
    {
        Formatter.DeserializeRequest(message, parameters);
    }
}

およびOperationBegaviorで

        public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
    {
        ServerMessageFormatter Formatter = new ServerMessageFormatter(dispatchOperation.Formatter);
        dispatchOperation.Formatter = Formatter;
    }

そして石鹸サービスを呼び出します

  GetInfoRequest message = CheckedFields;
    string soap = @"


                ServiceModel/IService/GetSoapData






        ";
    XmlSerializer serializer = new XmlSerializer(typeof(GetInfoRequest));
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://dev.add.renault.com/Service.svc/soap");
    MemoryStream stream1 = new MemoryStream();
    serializer.Serialize(stream1, message);
    stream1.Position = 0;
    StreamReader sr = new StreamReader(stream1);
    string t = sr.ReadToEnd();
    t = t.Remove(0, 22).Trim();
    t = string.Format(soap, t);
    ASCIIEncoding encoding = new ASCIIEncoding();
    request.Timeout = 99999999;
    request.ContentLength = t.Length;
    request.Method = "POST";
    request.ContentType = "application/soap+xml; charset=utf-8";
    request.Accept = "application/soap+xml; charset=utf-8";

    using (Stream stm = request.GetRequestStream())
    {
        using (StreamWriter stmw = new StreamWriter(stm))
        {
            stmw.Write(t);
        }
    }

    var response = (HttpWebResponse)request.GetResponse();
    var abc = new StreamReader(response.GetResponseStream());

問題は、RESTサービスを呼び出してDeserializeRequestにブレークポイントを設定すると、FormatterがOperation Behaviorから値を設定したことがわかります。 しかし、SOAPサービスを呼び出すと、Formatterの値がnullになり、逆シリアル化が中止されました。 石鹸を呼び出すときに問題があるのはなぜですか? 何か案が?

残念ながら、Operation Behaviorでブレークポイントを起動できず、dispatchOperationの値を確認できません…​

  2  1


ベストアンサー

カスタムIDispatchMessageFormatter拡張機能を追加するようにサービスを構成する方法は示しません。 したがって、ここで推測するだけで、soapベースのバインディングエンドポイントではなく、webHttpBindingエンドポイントにのみ追加することができます。 WebHttpBehaviorメソッド(GetRequestDispatchFormatterおよびGetReplyDispatchFormatter)を使用している場合、これはSOAPエンドポイントには適用されません。 このhttp://blogs.msdn.com/b/carlosfigueira/archive/2011/05/03/wcf-extensibility-message-formatters.aspx [ブログ投稿]では、webHttpBindingおよびbasicHttpBindingでIDispatchMessageFormatterを使用する方法の概要を説明しています。

編集:記事の特定のコードは、カスタムメッセージフォーマッターをbasicHttpBindingに追加する方法を示しています。 そのセクションの直前に、このアプローチが必要な理由を説明します。

    //--- snipped ---//

    string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
    ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
    ServiceEndpoint endpoint = host.AddServiceEndpoint(typeof(ITest), new BasicHttpBinding(), "");
    endpoint.Contract.Operations.Find("Add").Behaviors.Add(new MyOperationBehaviorAttribute());
    host.Open();

    //--- snipped ---//

2


タイトルとURLをコピーしました