Skip to main content
 首页 » 编程设计

c#之如何等到调用 Web 服务完成

2024年01月26日27wuhuacong

我正在尝试从 Web 服务获取 FedAuth Cookie。但正在发生的事情是,在我从 Web 服务获得结果之前,另一个方法 GetFedAuthCookieFromSOAPResponse 方法正在执行,传递给它的参数正在变为 null 。因此我得到了异常(exception):

startIndex 不能大于字符串的长度。参数名称:startIndex

如何等到从 Web 服务获得 soap 响应,然后执行方法 GetFedAuthCookieFromSOAPResponse?

static void Main(string[] args) 
        { 
            string url = "https://server/site"; 
            string soapResponse = GetSOAPResponse(url, "http://site/server/exapmle.asmx"); 
            Console.WriteLine(GetFedAuthCookieFromSOAPResponse(soapResponse)); 
            Console.WriteLine("Press ENTER to close program"); 
            Console.ReadLine(); 
        } 
        internal static string GetSOAPResponse(string url, string serviceURL) 
        { 
            using (WebClient client = new WebClient()) 
            { 
                string request = "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"><soap:Body><GetFedAuthCookie xmlns=\"http://tempuri.org/\"><requestUrl>" + url + "</requestUrl><userName></userName><password></password></GetFedAuthCookie></soap:Body></soap:Envelope>"; 
                client.Headers.Add(HttpRequestHeader.ContentType, "text/xml; charset=utf-8"); 
                client.Headers.Add("SOAPAction", "http://tempuri.org/GetFedAuthCookie"); 
                string soapResult = string.Empty; 
                client.UploadString(new Uri(serviceURL), request); 
                client.UploadStringCompleted += new UploadStringCompletedEventHandler(delegate(object sender, UploadStringCompletedEventArgs e) 
                { 
                    soapResult = e.Result; 
                });                 
                return soapResult; 
            } 
        } 
        internal static string GetFedAuthCookieFromSOAPResponse(string soapResponse) 
        { 
            string openingTag = "<GetFedAuthCookieResult>"; 
            string closingTag = "</GetFedAuthCookieResult>"; 
            int startIndex = soapResponse.IndexOf(openingTag) + openingTag.Length; 
            int length = soapResponse.IndexOf(closingTag) - startIndex; 
            return soapResponse.Substring(startIndex, length); 
        } 

请您参考如下方法:

UploadString 已经是一个同步方法。这意味着当方法返回时操作已经完成。 UploadStringCompleted 仅在处理 UploadStringAsync 或 UploadStringTaskAsync 等异步方法时使用。

UploadString 返回一个字符串,它是来自服务器的响应。

你只需要

string soapResult = client.UploadString(new Uri(serviceURL), request); 
return soapResult;