如何从Android设备访问ServiceStack上的Web服务?

时间:2014-03-21 07:12:17

标签: c# android .net web-services servicestack

我有一个Android应用程序,它应该向我在ServiceStack上创建的一个简单的HelloWorld C#webservice发送请求,但我无法连接。我尝试连接时,我的应用程序崩溃了。这是我在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");
    } 

ServiceStack的我的C#服务代码:

//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但它没有用。

我感谢任何指导。谢谢。

2 个答案:

答案 0 :(得分:1)

  

无法正常工作如果我将localhost替换为我的IP地址,并在我的笔记本电脑上的浏览器中

如果您尝试通过计算机网络浏览器中的本地IP地址192.168.1.7访问ServiceStack服务且无法访问,则该问题不会与Android隔离

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

检查您是否正在侦听正确的IP:

您的ServiceStack服务未配置为侦听除localhost之外的任何其他接口上的请求。 选择相关的托管选项:

自托管:

如果您是自托管,并且您已将应用主机配置为以appHost.Start("http://localhost:62938/");开头,则会发生这种情况。您需要将localhost替换为+符号,才能让其侦听所有本地地址。

IIS Express:

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

This tutorial by Scott Hanselman也非常好,并为配置IIS Express提供了很好的分步说明。

IIS:

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

防火墙:

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

正确IP:

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


在您可以通过开发计算机上的Web浏览器成功访问服务之前,在本地网络IP上开始192.168.1.X,我就不会尝试从Android访问。如果其他系统也无法访问您的服务,则不是Android问题。

我希望有所帮助。如果您提供有关特定环境的更多信息,我可能会提供更具体的说明。 如果我不得不猜测,我会说IIS Express问题。


编辑:

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

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

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

答案 1 :(得分:0)

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

其他特殊设备IP可在Andorid's documentation中找到。