【问题标题】:Android -- How to access data in an ASP.NET database via app?Android -- 如何通过应用程序访问 ASP.NET 数据库中的数据?
【发布时间】:2010-07-22 17:37:38
【问题描述】:

我有一个 Windows web server 已经设置了一个网站 (unlimited application pools),我希望能够通过我正在开发的 Android app 访问该服务器上的 database。我怎样才能做到这一点?有人可以指点我一个教程或提供代码示例来说明如何进行这种跨平台(Android/JavaASP.NET/C#)通信吗?

(我正在尝试在我的服务器上为我的Android 游戏创建排行榜或全球记分板。)

谢谢。

【问题讨论】:

  • 创建一个asp.net webservice来消费。

标签: c# java asp.net android http


【解决方案1】:

您的应用应该公开一个网络服务。 没有对基于 .net soap 的 web 服务的原生支持。但是你可以使用 ksoap android 端口:

http://code.google.com/p/ksoap2-android/

允许安卓应用使用 .net asmx 网络服务。 然而,客户端复杂的反序列化涉及为您想要传递给客户端的每个对象编写大量代码。

我在一个项目中尝试过,但遇到了一些问题(我可以将结果返回给客户端,但我传递的参数始终为 null 或其他方式 - 我可以传递参数但结果为 null) .

这是我发布的获取 int 的示例:How to call a .NET Webservice from Android using KSOAP2?

但是,根据我目前的知识,我建议使用返回 json 字符串的 .asmx Web 服务并使用 java json 序列化程序来解析输出。优点:

  • 少写代码
  • 更快,因为移动设备并不总是具有良好的互联网连接,而且来自 soap 的 xml 开销比 json 大。

快速入门:

  • 在您的 .net webapp 中创建一个新的 asmx Webservice。
  • 包括对 System.Web 的引用。
  • 用 [ScriptService] 装饰你的 webservice 类,用 [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 装饰你的方法

    [ScriptService]
    public class WebService1 : System.Web.Services.WebService 
    {
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string HelloAndroid()
        {
            return "Hello Android";
        }
    }
    

(我认为您必须添加对 System.Web.Extension.dll 的引用,该引用自 .net 3.5 起可用)。

  • 除非您发出内容类型为“application/json”的 HTTPPost 请求,否则您的 Web 服务仍将返回 XML(因此您可以将其与肥皂客户端一起使用)。

  • 使用此代码从 android 联系网络服务:

    private JSONObject sendJsonRequest(string host, int port,
           String uri, JSONObject param) 
                throws ClientProtocolException, IOException, JSONException
    {
        HttpClient httpClient = new DefaultHttpClient();
        HttpHost httpHost = new HttpHost(host, port);   
        HttpPost httpPost = new HttpPost(uri);
        httpPost.addHeader("Content-Type", "application/json; charset=utf-8");
    
        if (param != null)
        {
            HttpEntity bodyEntity = new StringEntity(param.toString(), "utf8");
            httpPost.setEntity(bodyEntity);
        }
    
        HttpResponse response = httpClient.execute(httpHost, httpPost);
        HttpEntity entity = response.getEntity();
    
        String result = null;
        if (entity != null) {
            InputStream instream = entity.getContent();
            BufferedReader reader = new BufferedReader(
                 new InputStreamReader(instream));
            StringBuilder sb = new StringBuilder();
    
            String line = null;
            while ((line = reader.readLine()) != null)
                sb.append(line + "\n");
    
            result = sb.toString();
            instream.close();           
        }
    
        httpPost.abort();
        return result != null ? new JSONObject(result) : null;
    }
    

    如果您的网络服务方法如下所示:

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public User GetUser(string name, int age)
    {
        return new User { Name = name, Age = age; }
    }
    

    你可以在android中这样调用它:

    public void getUser() {
        // if you put a json object to the server
        // the properties are automagically mapped to the methods' input parameters
        JSONObject param = new JSONObject();
        param.put("name", "John Doe");
        param.put("age", 47);
    
    
            JSONObject result = sendJsonRequest("server", 80, 
                  "http://server:80/service1.asmx/GetUser", param);
            if (result != null) {
                JSONObject user = new JSONObject(result.getString("d"));
                // .net webservices always return the result
                // wrapped in a parameter named "d"
                system.out.println(user.getString("name"));
                system.out.println(user.getInt("age").toString());
            }
    }
    

在客户端处理服务器异常:

  1. 将此类添加到您的项目中:

    import org.json.JSONException;
    import org.json.JSONObject;
    
    public class JSONExceptionHelper {
    
        private static final String KEY_MESSAGE = "Message";
        private static final String KEY_EXCEPTIONTYPE = "ExceptionType";
        private static final String KEY_STACKTRACE = "StackTrace";
    
        public static boolean isException(JSONObject json) {
            return json == null 
                ? false
                : json.has(KEY_MESSAGE) && 
                  json.has(KEY_EXCEPTIONTYPE) && 
                  json.has(KEY_STACKTRACE);
        }
    
        public static void ThrowJsonException(JSONObject json) throws JSONException {
    
            String message = json.getString(KEY_MESSAGE);
            String exceptiontype = json.getString(KEY_EXCEPTIONTYPE);
            String stacktrace = json.getString(KEY_STACKTRACE);
    
            StringBuilder sb = new StringBuilder();
            sb.append(exceptiontype);
            sb.append(": ");
            sb.append(message);
            sb.append(System.getProperty("line.separator"));
            sb.append(stacktrace);
    
            throw new JSONException(sb.toString());
        }
    
    }
    

现在将 sendJSONRequest 中的 return 语句替换为:

    JSONObject json = result != null ? new JSONObject(result) : null
    if (JSONExceptionHelper.isException(json))
        JSONExceptionHelper.ThrowJsonException(json); 
    return json;

请注意:只有当连接来自本地主机时,异常才会传递给客户端。 否则你会得到一个 http 错误 500(或 501?我不记得了)。您必须配置 IIS 以将错误 500 发送到客户端。

试一试,创建一个总是抛出异常的 web 服务。

【讨论】:

  • 这是棘手的部分。如果不是 100% 满足所有要求,ASMX 将回退到 XML。要求是: 1) .net 3.5 或 2.0 有一个 ajax 包可从 MS 下载。 2) 使用 ScriptService 和 SciptMethod 进行适当的装饰。 3) 出于安全原因,我认为请求类型必须是 POST 4) Content-Type 必须是“application/json” 5) 如果您将项目从 VS2005 更新到 2008,则 web.config 文件中可能缺少一些值。
  • 现在您的评论不见了?也许您解决了“xml 而不是 json”的问题。无论如何,这里有一篇关于这个问题的好博文:encosia.com/2010/03/03/…encosia.com/2010/05/31/…
  • 好的,谢谢。我确实想通了。我做了一个 1 字符的错字,导致服务器返回一个 xml 字符串:“根级别的数据无效。第 1 行,位置 1。”直到我将整个错误字符串复制到 Word 中(它在 Eclipse 中被截断),我才发现错误。我删除了评论,因为这是一个用户错误。我希望没有人会注意到。也就是说,你在这篇文章中的例子和信息是我加入这个网站以来收到的最好的。除了我犯的错误之外,我的实施进展顺利。非常感谢。
  • 我编写了一个帮助类,它可以更轻松地跟踪 .net 引发的异常。它基本上检查输出是否包含堆栈跟踪并在客户端重新抛出它。我更新了我的答案。
【解决方案2】:

听起来像是 Web 服务 的工作。

首先在 Windows 网络服务器上创建一个网络服务,您可以使用ASP.NET(或者可能是this might be more current)来执行此操作。

在 Java 端,您可以调用 Web 服务并使用返回的结果。我认为this question 可以帮助您在这方面开始。

【讨论】:

  • 感谢您的回复。你的建议很有帮助。在我从 SchlaWiener 的回复中得到的帮助下,我得以让它发挥作用。谢谢。
【解决方案3】:

如果您在编写返回对象数组的 Web 方法时遇到问题,您可能需要参考这里:

ksoap android web-service tutorial

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多