如何从android设备访问ServiceStack上的web服务

本文关键字:ServiceStack 上的 web 服务 访问 android | 更新日期: 2023-09-27 17:51:19

我有一个android应用程序,它应该发送一个请求到一个简单的HelloWorld c# webservice,我在ServiceStack上做的,但我不能连接。当我尝试连接时,应用程序崩溃了。下面是我在Eclipse上的代码,试图访问ServiceStack服务:

String base = "http://192.168.1.7:62938/json/reply/Hello?Name=";
    String str = editTextField.getText().toString();
    StringBuilder url = new StringBuilder(base + str);
    String result = "";
HttpClient hc = new DefaultHttpClient();
    HttpGet httpget = new HttpGet(url.toString());
    HttpResponse r = hc.execute(httpget);
    int status = r.getStatusLine().getStatusCode();
    if (status == 200) {
        HttpEntity e = r.getEntity();
        String data = EntityUtils.toString(e);
        JSONObject o = new JSONObject(data);
        result= o.getString("result");
    } 

我的c#服务代码ServiceStack:

//Request DTO
public class Hello
{
    public string Name { get; set; }
}
//Response DTO
public class HelloResponse
{
    public string Result { get; set; }
    public ResponseStatus ResponseStatus { get; set; } 
}
//Can be called via any endpoint or format, see: //http://mono.servicestack.net/ServiceStack.Hello/
public class HelloService : Service
{
    public object Any(Hello request)
    {
        return new HelloResponse { Result = "Helloooo, " + request.Name };
    }
}

我的服务工作正常在我的笔记本电脑上,当我去localhost:62938/json/reply/Hello?Name = " arbitraryName "但是当我尝试用笔记本电脑的ip地址替换localhost并从android设备访问该服务时,它不起作用。如果我用我的IP地址替换localhost并在我的笔记本电脑上的浏览器上尝试它也不起作用。注意:我想让它从一个真正的android设备工作,而不是一个模拟器。

ServiceStack服务有什么不同,我不能从另一个设备正常访问它?我已经尝试打开端口62938,它没有工作。

感谢任何指导。谢谢你!

如何从android设备访问ServiceStack上的web服务

不工作如果我用我的IP地址替换localhost并在我的笔记本电脑上的浏览器上尝试

如果您尝试通过计算机的web浏览器中的本地IP地址192.168.1.7访问ServiceStack服务,并且也无法访问,那么该问题并非孤立于Android

这个问题可能是以下一个或多个问题的结果:

检查你正在监听正确的ip:

你的ServiceStack服务没有被配置为侦听除localhost以外的任何其他接口上的请求。选择相关的主机选项:

自我托管:

如果你是自托管的,并且你已经将应用程序主机配置为从appHost.Start("http://localhost:62938/");启动,则可能发生这种情况。您需要将localhost替换为+符号,以使其侦听所有本地地址。

IIS Express:

默认情况下,Visual Studio在开发期间使用IIS Express, 除非手动配置为使用IIS,并且仅限于本地主机请求。您应该看到关于如何配置IIS Express以允许非本地访问的答案。

这个由Scott Hanselman编写的教程也非常好,它提供了配置IIS Express的分步指导。

IIS:

您可以按照以下说明确认服务器配置为侦听的IP地址。它们提供了IIS6和IIS7+的指令。

防火墙:

您的计算机可能有防火墙阻止您访问该端口,或接受外部通信。注意你的防火墙可能内置在你运行的杀毒软件中。您应该为端口62938上的http流量添加一个例外规则。

正确的IP:

您正在尝试访问192.168.1.7。您应该确认IP地址实际上是正确的。大多数家庭网络都通过网络路由器配置为提供动态IP地址。自您上次检查IP地址以来,该IP地址可能已更改。您应该尝试从开发机器运行ping到IP。


直到你可以通过你的开发机器上的web浏览器成功访问服务,在本地网络IP启动192.168.1.X,然后我不会尝试从Android访问。如果其他系统也不能访问你的服务,这不是Android的问题。

我希望这对你有帮助。如果你能提供更多关于你的具体环境的信息,我可能会提供更具体的说明。如果要我猜的话,我会说是IIS Express issue


编辑:

现在你可以在android设备的web浏览器中访问该服务,但不能在应用程序中访问,我们知道该服务是可远程访问的。这意味着您的连接问题现在与您的应用程序隔离了。我要检查的第一件事是,你的应用程序有权限发出网络请求。在你的AndroidManifest.xml你需要确保android.permission.INTERNET包含

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

如果您有该权限,那么您应该能够成功地发出请求。如果继续失败,则需要从导致应用程序崩溃的异常中诊断原因。在这种情况下,您应该将数据请求包装在try { ... } catch(Exception exception) { }中并记录异常。

由于Android模拟器被认为运行在不同的设备上,为了引用本地开发机器上的环回IP(127.0.0.1),我们需要使用特殊的10.0.2.2别名。

其他特殊的设备IP可以在android的文档中找到。