2014-10-31 35 views
0

这段代码对我来说看起来不错,我想在使用语句里面使用return语句没错,但是编译器说并不是所有的代码路径都返回值。我应该如何解决这个问题才能返回字符串结果?返回语句里面使用statemtn导致错误“不是所有的代码路径返回值”

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"); 
      } 
     } 
+0

错误是不言自明的。如果代码抛出错误,它可能不会返回到return语句,因此不会返回任何内容。将return语句移到catch块之后。 – Tim 2014-10-31 06:52:58

+1

备注 - 通过简单陈述'using'语句并在最后一个之后打开括号,可以避免繁重的嵌套。 – 2014-10-31 06:55:36

回答

4

的问题是不是你的using语句,但你的try声明:excecution 可以try块随时随地中止它得到return,然后将代码输入您的catch(TimeoutException ex)处理程序之前,但你不知道在那里有一个return声明。

我看到你的代码似乎是一个web应用程序的一部分,但是这看起来像一个“后端”方法,它将内容返回给一个使用方法。您不应该从这里写入Response,而是返回null或者不要捕获异常,而是让您的CallWebService的调用者负责显示错误消息。

我看到你正在做一些其他错误,类似于使用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; 
    } 
} 
  • 您使用dynamic不正确。 dynamic不等于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是否返回空值,如果是,则显示错误消息。

请注意,在这两个catch块中,您都可能想要记录异常,因为它们的详细信息正在被吞噬。他们可能会指出已停机的服务或其他问题。

+0

谢谢。真的很好的更新我的旧VB.NET代码翻译成C#。 – 2014-10-31 07:10:10

+0

唯一的问题是在这里使用(HttpWebResponse response = webRequest.GetResponse()) - 不能隐式地将类型'System.Net.WebResponse'转换为'System.Net.HttpWebResponse'。存在明确的转换(你是否缺少演员?) – 2014-10-31 07:29:30

+0

@ andrey.shedko抱歉,这是一个错误。是的,你需要对'HttpWebResponse'进行显式转换。这是.NET Framework中的一个设计缺陷。 – Dai 2014-10-31 07:41:59