用完从Android应用程序调用我的webservice的端口

时间:2014-11-10 18:46:42

标签: java c# android asp.net web-services

我有一个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);
}

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

如果第一次请求失败,则可能需要启用IIS Express以允许外部连接。在你的情况下,它看起来只是在运行一段时间后失败。

在你的问题中,我看到你

  1. “转到网络服务获取数据,然后在屏幕上显示,尽可能快地重复此操作。
  2. 没有在HttpTransportSE上调用“关闭”
  3. 您可能正在耗尽本地端口。您是否在重复使用所有请求?如果没有,请在完成后尝试关闭它。

答案 1 :(得分:0)

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

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