0

誰かが私を助けてくれることを願っています。私はしばらく C# でプログラミングしていません。答えは簡単だと思いますが、頭がわかりません。

System.Web.Services.Protocols.SoapHttpClientProtocol を呼び出す次のものがあります。私が持っている多くの呼び出しの 1 つだけを含めました。

public partial class ExchangeService : System.Web.Services.Protocols.SoapHttpClientProtocol   {

//Lots of code using Soap 

    [System.Web.Services.Protocols.SoapDocumentMethodAttribute("getDetailsLite", RequestNamespace="http://www.MySite.com/ExchangeService/", ResponseNamespace=" http://www.MySite.com/ExchangeService/", ", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
    [return: System.Xml.Serialization.XmlElementAttribute("Result", IsNullable=true)]
    public GetDetailsLiteResp getDetailsLite(getDetailsLiteReq request) {
        object[] results = this.Invoke("getDetailsLite", new object[] {
                    request});
        return ((getDetailsLiteResp)(results[0]));
    }

    public void getDetailsLiteAsync(getDetailsLiteReq request) {
        this. getDetailsLiteAsync(request, null);
    }

    public void getDetailsLiteAsync (getDetailsLiteReq request, object userState) {
        if ((this.getDetailsLiteOperationCompleted == null)) {
            this.getDetailsLiteOperationCompleted = new System.Threading.SendOrPostCallback(this.OngetDetailsLiteOperationCompleted);
        }
        this.InvokeAsync("getDetailsLite", new object[] {
                    request}, this. getDetailsLiteOperationCompleted, userState);
    }
}

SoapHttpClientProtocol が呼び出す WebRequest をオーバーライドしたいと考えています。SoapHttpClientProtocol は次のようになります (System.Web.Services.dll から呼び出されると思います)。

namespace System.Web.Services.Protocols  {
    public class SoapHttpClientProtocol : HttpWebClientProtocol    {
    public SoapHttpClientProtocol();
    public SoapProtocolVersion SoapVersion { get; set; }
    protected IAsyncResult BeginInvoke(string methodName, object[] parameters, AsyncCallback callback, object asyncState);
    public void Discover();
    protected object[] EndInvoke(IAsyncResult asyncResult);
    protected virtual XmlReader GetReaderForMessage(SoapClientMessage message, int bufferSize);

    //This line is the one i am talking about
    protected override WebRequest GetWebRequest(Uri uri);

    protected virtual XmlWriter GetWriterForMessage(SoapClientMessage message, int bufferSize);
    protected object[] Invoke(string methodName, object[] parameters);
    protected void InvokeAsync(string methodName, object[] parameters, SendOrPostCallback callback);
    protected void InvokeAsync(string methodName, object[] parameters, SendOrPostCallback callback, object userState);
    }
}

次のようにするには、オーバーライド WebRequest GetWebRequest(Uri uri ) を保護する必要があります。

protected override WebRequest GetWebRequest(Uri uri)  {
    HttpWebRequest webRequest = (HttpWebRequest) base.GetWebRequest(uri);
    webRequest.KeepAlive = false;
    webRequest.ProtocolVersion=HttpVersion.Version10;
    return webRequest;
}

誰も私がこれを行う方法を知っていますか? SoapHttpClientProtocol 内で直接編集することはできませんが、99% 確実に行うべきではありません。

あなたが提供できるかもしれない助けをありがとう

4

2 に答える 2

2

ExchangeService部分クラスであるため、の宣言に追加する別のファイルを作成しExchangeService、GetWebRequest の適切なオーバーライドも宣言できます。これにより、 のカスタム機能を記述しExchangeServiceながら、WSDL が変更された場合でも更新可能にすることができます。

詳細については、MSDN の記事Partial Classes and Methods (C# Programming Guide)を参照してください。

于 2012-06-13T02:24:19.723 に答える
1

それをサブクラス化しますか?GetWebRequestは、ルート クラスWebClientProtocolで仮想としてマークされているため、メソッドをオーバーライドできます。

public class MyHttpProtocol : SoapHttpClientProtocol  
{
    public override WebRequest GetWebRequest(Uri uri)
    {
        // Base request:
        WebRequest request = base.GetWebRequest(uri);

        // You code goes here...

        // Return...
        return request;
    }
}

次に、サービス クラス内で必要に応じてMyHttpProtocolを使用します。

于 2012-06-13T02:28:06.080 に答える