从安卓应用程序调用我的网络服务的端口用完了

本文关键字:网络服务 应用程序 调用 我的 | 更新日期: 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以允许外部连接。在您的情况下,它看起来只是在运行了一段时间后才失败。

在你的问题中,我看到你

  1. "转到web服务获取数据,然后将其显示在屏幕上,以最快的速度重复此操作。
  2. 未在HttpTransportSE上调用"关闭"

您可能没有本地端口。您是否在所有请求中重复使用连接?如果没有,请在完成后尝试关闭它。

我的Web服务引用了一个api来获取值,然后通过Web服务将值传递给android应用程序。

问题是,每次调用Web服务时,都会创建一个对api的新引用,并且在发送请求后,它永远不会关闭端口。一旦我停止引用api,一切都正常了。实现这一点的一个方法是,我让Web服务监视一个文件夹,并发送上次创建的文件中的数据。然后创建另一个程序连接到api并将数据输出到该文件夹。这不是最优雅的解决方案,但它可以作为我正在做的事情的概念证明。仍然不完全确定为什么Web服务从未关闭端口,我怀疑Web服务无法处理对api的引用,但我真的不确定。