从安卓应用程序调用我的网络服务的端口用完了
本文关键字:网络服务 应用程序 调用 我的 | 更新日期: 2023-09-27 18:29:58
我有一个android应用程序和一个C#web服务
我在IIS Express上托管我的web服务-只需设置目录就可以了。
我的android应用程序转到web服务获取数据,然后将其显示在屏幕上,并以最快的速度重复此操作。
一段时间后,我的android应用程序将抛出以下异常:"SoapFault-错误代码:'soap:Server'错误字符串:'服务器无法处理请求。--->在10101到11100范围内没有可用的端口'错误演员:'null'详细信息:org.kxml2.kdom.Node@41bdf340"我在谷歌上搜索了一下,没有找到任何对我有帮助的东西。
我运行CurrPorts来观察端口,看起来每次应用程序调用web服务时都使用不同的端口。它们都使用端口80,但使用不同的远程端口。
正在对以下代码行引发异常"SoapPrimitive响应=(SoapPrimity)_envelope.getResponse();"
如果我运行IISReset,应用程序将再次返回获取数据,直到之后的某个时候才能获得上述异常。
这是我的web服务的代码,它只是返回一个逗号分隔的字符串(它会做一些更有趣的事情,只是试图让它工作)
Web服务代码
[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的进程,该进程的端口已用完。
通过一些挖掘和实验,Web服务在每次调用"GetDefaultResults"时都会更新。这使w3wp.exe处于侦听状态,并且在运行iisreset之前,它们永远不会消失。一段时间后,它会使用剩余的可用端口,并开始抛出该异常。
为什么它不重用同一个Web服务,而不是每次都创建一个新的Web服务。
如果这不可能,我应该在Web服务中编写什么代码来在连接完成后关闭连接。我进行了一次破解,让它在5秒钟后关闭,看看这是否至少有效。它确实清理了w3wp.exe,但过了很短时间,我开始在客户端上出现此异常。"应为:START_TAG{http://schemas.xmlsoap.org/soap/envelope/}信封(位置:START_TAG@2:7英寸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);
}
谢谢你的帮助。
如果第一次请求失败,则可能需要启用IIS Express以允许外部连接。在您的情况下,它看起来只是在运行了一段时间后才失败。
在你的问题中,我看到你
- "转到web服务获取数据,然后将其显示在屏幕上,以最快的速度重复此操作。
- 未在HttpTransportSE上调用"关闭"
您可能没有本地端口。您是否在所有请求中重复使用连接?如果没有,请在完成后尝试关闭它。
我的Web服务引用了一个api来获取值,然后通过Web服务将值传递给android应用程序。
问题是,每次调用Web服务时,都会创建一个对api的新引用,并且在发送请求后,它永远不会关闭端口。一旦我停止引用api,一切都正常了。实现这一点的一个方法是,我让Web服务监视一个文件夹,并发送上次创建的文件中的数据。然后创建另一个程序连接到api并将数据输出到该文件夹。这不是最优雅的解决方案,但它可以作为我正在做的事情的概念证明。仍然不完全确定为什么Web服务从未关闭端口,我怀疑Web服务无法处理对api的引用,但我真的不确定。