这段代码对我来说很好看,我认为在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");
}
}
答案 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;
}
}
dynamic
。 dynamic
不等同于VB的Dim
声明。HttpWebRequest
的异步方法但阻止,所以您也可以使用阻止方法(GetResponse
)BufferedStream
中包含响应流,只需直接使用它。using
块组合在一起。HttpWebResponse
会自动执行此操作:http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.automaticdecompression.aspx CallWebService
的消费者处于未知状态,而消费者应该检查查看CallWebService
是否返回null,如果是,则呈现错误消息。请注意,在两个catch
块中,您可能希望记录异常,因为它们的详细信息被吞下。他们可能会指出服务失败或其他问题。