返回语句里面使用语句导致错误“并非所有代码路径返回值”

时间:2014-10-31 06:50:23

标签: c# return using

这段代码对我来说很好看,我认为在using语句中使用return语句没有错,但是编译器说不是所有的代码路径都返回值。我该如何解决这个问题才能返回字符串结果?

public static string CallWebService(string an, string xmlcommand)
        {
            //test
            //Dim _url = "http://testapi.interface-xml.com/appservices/ws/FrontendService"
            //live
            dynamic _url = "http://212.170.239.18/appservices/ws/FrontendService";
            try
            {
                string soapResult = null;
                XmlDocument soapEnvelopeXml = CreateSoapEnvelope(xmlcommand);
                HttpWebRequest webRequest = CreateWebRequest(_url, an);
                webRequest.Headers.Add("Accept-Encoding", "gzip, deflate");
                InsertSoapEnvelopeIntoWebRequest(soapEnvelopeXml, webRequest);
                IAsyncResult asyncResult = webRequest.BeginGetResponse(null, null);
                asyncResult.AsyncWaitHandle.WaitOne();
                using (WebResponse webResponse = webRequest.EndGetResponse(asyncResult))
                {
                    using (BufferedStream bs = new BufferedStream(webResponse.GetResponseStream()))
                    {
                        using (GZipStream gz = new GZipStream(bs, CompressionMode.Decompress))
                        {
                            using (StreamReader rd = new StreamReader(gz))
                            {
                                if (an == "HotelValuedAvailRQ")
                                {
                                    soapResult = rd.ReadLine();
                                }
                                else
                                {
                                    soapResult = rd.ReadToEnd();
                                }
                                return soapResult; //This is what I want to return
                            }
                        }
                    }
                }

            }
            catch (TimeoutException ex)
            {
                StringBuilder s = new StringBuilder(2000);
                s.AppendFormat("<b>К сожалению превышено время ожидания.</b>: {0} <br /><b>Источник</b>: {1}<br /><a href='javascript:history.back();'>Вернуться</a>", ex.Message, ex.InnerException);
                HttpContext.Current.Session["bug"] = s.ToString();
                HttpContext.Current.Response.Redirect("../errors/error.aspx");
            }
        }

1 个答案:

答案 0 :(得分:4)

问题不在于您的using声明,但您的try声明:执行 可能会在try块中的任意位置中止return,然后代码会进入您的catch(TimeoutException ex)处理程序,但您在那里没有return声明。

我看到你的代码似乎是网络应用程序的一部分,但这看起来像是一个&#34;后端&#34;将内容返回到使用方法的方法。您不应该从此处写信Response,而是返回null或者不要捕获异常,而是让CallWebService的来电者负责显示错误消息。< / p>

我发现你还犯了一​​些其他错误,例如使用dynamic代替String,这就是我编写代码的方式:

public static string CallWebService(string an, string xmlcommand)
{
    String url = @"http://212.170.239.18/appservices/ws/FrontendService";
    try
    {
        String soapResult = null;
        XmlDocument soapEnvelopeXml = CreateSoapEnvelope(xmlcommand);
        HttpWebRequest webRequest = CreateWebRequest(_url, an);
        webRequest.Headers.Add("Accept-Encoding", "gzip, deflate");
        InsertSoapEnvelopeIntoWebRequest(soapEnvelopeXml, webRequest);
        using(HttpWebResponse response = webRequest.GetResponse())
        using (Stream s = webResponse.GetResponseStream())
        using (StreamReader rd = new StreamReader(gz))
        {
            if (an == "HotelValuedAvailRQ")
            {
                soapResult = rd.ReadLine();
            }
            else
            {
                soapResult = rd.ReadToEnd();
            }
            return soapResult;
        }
    }
    catch (WebException)
    { 
        return null;
    }
    catch (TimeoutException)
    {
        return null;
    }
}
  • 您错误地使用了dynamicdynamic不等同于VB的Dim声明。
  • 您使用HttpWebRequest的异步方法但阻止,所以您也可以使用阻止方法(GetResponse
  • 您不应该在BufferedStream中包含响应流,只需直接使用它。
  • 您可以将using块组合在一起。
  • 您不需要自己执行GZip解压缩,HttpWebResponse会自动执行此操作:http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.automaticdecompression.aspx
  • 我认为从后端方法控制ASP.NET HTTP响应是个好主意,因为它会使CallWebService的消费者处于未知状态,而消费者应该检查查看CallWebService是否返回null,如果是,则呈现错误消息。

请注意,在两个catch块中,您可能希望记录异常,因为它们的详细信息被吞下。他们可能会指出服务失败或其他问题。