如何从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,它没有工作。
感谢任何指导。谢谢你!
它也不工作如果我用我的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的文档中找到。