Autor Beitrag
pascalsv
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win XP Prof. SP2 / Windows 7
Visual Studio 2008 / Silverlight 3 / Silverlight 4 Beta
BeitragVerfasst: Do 09.10.08 14:53 
Hallo zusammen,

ich nutze einen WebService (nicht von mir) und habe dafür im VS2008 ein Proxy erzeugt. Bei der Kommunikation kommt es häufig zu Verbindungsabbrüchen: System.Net.WebException: The request was aborted: The request was canceled. Auf dieversen Seiten (wie z.B. social.msdn.microsof...b-bf9d-26341a204475/) wird empfohlen, die Methode "GetWebRequest(Uri uri)" zu überschreiben. Leider finde ich diese in der Refernece.cs des Proxy nicht. Eine Methode ist z.B. "OPenReport", die ich hier reingehängt habe:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("OpenReportResponse", Namespace="urn:sap-com:document:sap:soap:functions:mc-style")]
        public OpenReportResponse OpenReport([System.Xml.Serialization.XmlElementAttribute("OpenReport", Namespace="urn:com:document:soap:functions:mc-style")] OpenReport OpenReport1) {
            object[] results = this.Invoke("OpenReport"new object[] {
                        OpenReport1});
            return ((OpenReportResponse)(results[0]));
        }
        
        /// <remarks/>
        public void OpenReportAsync(OpenReport OpenReport1) {
            this.OpenReportAsync(OpenReport1, null);
        }
        
        /// <remarks/>
        public void OpenReportAsync(OpenReport OpenReport1, object userState) {
            if ((this.OpenReportOperationCompleted == null)) {
                this.OpenReportOperationCompleted = new System.Threading.SendOrPostCallback(this.OnOpenReportOperationCompleted);
            }
            this.InvokeAsync("OpenReport"new object[] {
                        OpenReport1}, this.OpenReportOperationCompleted, userState);
        }
        
        private void OnOpenReportOperationCompleted(object arg) {
            if ((this.OpenReportCompleted != null)) {
                System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
                this.OpenReportCompleted(thisnew OpenReportCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
            }
        }


Was muss ich hier ändern, um den keepalive Status zu setzen?

Danke,

Pascal
pascalsv Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win XP Prof. SP2 / Windows 7
Visual Studio 2008 / Silverlight 3 / Silverlight 4 Beta
BeitragVerfasst: Fr 10.10.08 10:14 
Hallo zusammen,

ich habe das Problem mit einem "Workaround" gelöst. Ich überschreibe die Methode der Basisklasse und leite den WebService Proxy dann von der angepassten Basisklasse ab:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
    public abstract class BaseService : System.Web.Services.Protocols.SoapHttpClientProtocol
    {
        protected override System.Net.WebRequest GetWebRequest(Uri uri)
        {
            System.Net.HttpWebRequest webRequest = (System.Net.HttpWebRequest)base.GetWebRequest(uri);
            webRequest.KeepAlive = false;
            //this is said to be crucial when communicating with SAP systems
            webRequest.ServicePoint.Expect100Continue = false;
            return webRequest;
        }
    }

    public partial class BYDCRYSTALREPORTDT : BaseService {
...


Nun habe ich nur noch das Problem, dass ich diese Änderung in der automatisch von VS2008 erstellten reference.cs Datei ausführe. Diese wird jedoch nach jedem Update des WebService überschrieben. Wie kann ich die Änderung aus der Reference.cs ausziehen? Wenn ich dies in eine andere Datei packe, kommt die Fehlermeldung: "AccessService.GetWebRequest(System.Uri)': no suitable method found to override". Was mache ich falsch?

Danke,

Pascal