我有一个Android应用程序和一个C#Web服务
我在IIS Express上托管我的网络服务 - 没有什么特别的设置目录。
我的Android应用程序转到Web服务获取数据,然后在屏幕上显示它,并尽可能快地重复此操作。
一段时间后,我的Android应用程序将抛出以下异常: " SoapFault - faultcode:' soap:Server' faultstring:'服务器无法处理请求。 ---> 10101到11100'范围内没有可用的端口。 faultactor:' null'详情:org.kxml2.kdom.Node@41bdf340" 我已经谷歌搜索了一下,没有找到任何可以帮助我的东西。
我运行了CurrPorts来观察端口,看起来每次应用调用Web服务时它都使用不同的端口。 它们都使用端口80但不同的远程端口。
以下代码行引发了异常 " SoapPrimitive response =(SoapPrimitive)_envelope.getResponse();"
如果我运行IISReset,应用程序将返回再次获取数据,直到此后某个时间获取上述异常。
这是我的网络服务的代码,它只是返回一个逗号分隔的字符串(它会做一些更有趣的事情,只是试图让它工作)
网络服务代码
[WebMethod]
public string GetDefaultResults()
{
return "100,1,0,125.987,124.993,117.904,116.038";
}
这是我的Android应用程序用来调用Web服务的代码。 我创建了一个新线程并让它调用此方法,然后将字符串值拆分为','然后把它放在几个不同的TextViews
public class WebService implements Runnable{
private static String NAMESPACE = "http://tempuri.org/";
private static String URL = "http://mymachine/mywebservice/service.asmx";
private static String SOAP_ACTION = "http://tempuri.org/";
private String _soapAndMethod;
private HttpTransportSE _androidHttpTransport;
private SoapSerializationEnvelope _envelope;
private String _methodName;
public WebService(String methodName) {
_methodName = methodName;
_soapAndMethod = SOAP_ACTION + _methodName;
SoapObject request = new SoapObject(NAMESPACE, methodName);
_envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
_envelope.dotNet = true;
_envelope.setOutputSoapObject(request);
_androidHttpTransport = new HttpTransportSE(URL);
}
@Override
public void run() {
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
}
public String InvokeWebService() {
String resTxt = null;
try {
_androidHttpTransport.call(_soapAndMethod, _envelope);
SoapPrimitive response = (SoapPrimitive) _envelope.getResponse();
resTxt = response.toString();
} catch (Exception e){
e.printStackTrace();
}
return resTxt;
}
}
任何帮助都会很棒。谢谢那些做出回应的人。 IIS中是否需要更改某些设置?我的代码中有没有遗漏的东西?
其他信息: 当服务器响应Web服务请求时,IIS会创建一个名为w3wp.exe的进程,并且此进程正在用尽端口。
进行一些挖掘和实验,每次调用" GetDefaultResults"时,Webservice都会被新建。这使得w3wp.exe处于Listening状态,并且在iisreset运行之前它们永远不会消失。 一段时间后,它使用剩余的可用端口并开始抛出该异常。
为什么不重复使用相同的Web服务而不是每次都创建一个新的Web服务。
如果不可能,我会在Web服务中编写什么代码,以便在完成后关闭连接。我放入一个黑客,让它在5秒钟后关闭,看看它是否至少可以工作。 它确实清理了w3wp.exe,但在很短的时间后我开始在客户端上获得此异常。 "预期:START_TAG {http://schemas.xmlsoap.org/soap/envelope/}信封(位置:START_TAG @ 2:7 in java.io.InputStreamReader@41beb098)" 所以这不是一个解决方法,但它帮助我理解问题更好一点。
protected override void Dispose(bool disposing)
{
System.Timers.Timer timer = new System.Timers.Timer();
timer.Interval = 5000;
timer.Elapsed += timer_Elapsed;
timer.Start();
base.Dispose(disposing);
}
void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
Environment.Exit(1);
}
感谢您的帮助。
答案 0 :(得分:0)
如果第一次请求失败,则可能需要启用IIS Express以允许外部连接。在你的情况下,它看起来只是在运行一段时间后失败。
在你的问题中,我看到你
您可能正在耗尽本地端口。您是否在重复使用所有请求?如果没有,请在完成后尝试关闭它。
答案 1 :(得分:0)
我的Web服务引用了一个api来获取值,然后将它们通过web服务传递给android应用程序。
问题在于每次调用webservice时都会向api创建一个新的引用,并且在发送请求之后它将永远不会关闭端口。一旦我停止引用api一切正常。 让这个工作起作用的一个方法就是让webservice监视一个文件夹并将数据发送到上次创建的文件中。然后创建另一个附加到api的程序并将数据输出到该文件夹。不是最优雅的解决方案,但它可以作为我正在做的事情的概念证明。 仍然不完全确定为什么Webservice从未关闭端口,我怀疑Web服务无法处理对api的引用,但我不太确定。