-3

我主要是一个低级系统开发人员,所以我对 Azure 提供的所有高级工具和所有这些流行语有点迷失了。

所以这就是我要构建的内容:我正在构建一个服务器,它有一个处理部分(可能使用 Azure Batch)和一个存储部分(使用存储、duh 和 DB)。我想将所有这些隐藏在客户端应用程序可以的界面后面:

  • 登录用户

  • 上传/下载选定的文件

  • 管理他们当前正在运行的工作或开始一些新的工作

客户端应用程序可能在 iPad、Web 浏览器、PC 等上。新功能可能会在服务器端出现或更改。这就是为什么选择“服务器接口”来标准化所有客户端交互的原因,但我不知道哪种 Azure 工具适合我对这个接口的需求。我不是在寻找像构建我自己的协议和服务器那样的低级别的东西,只是可以简单地完成工作的东西。

干杯

莱昂·康廷

4

2 回答 2

2

Azure 移动服务可能非常适合这里。好处是您可以快速制作原型。在当前门户中,您可以将移动服务与 Node/JavaScript 后端或 ASP.NET WebAPI 后端一起使用。节点选项是最快/最容易实现的。这种方法的一些好处:

  • 移动服务自动使用 NoSQL 样式表创建(认为它实际上存储在 SQL Azure DB 中),并为 CRUD 公开 REST 端点,以及每个端点的 JS 中可自定义的脚本。
  • 移动服务具有适用于 Windows(C# 或 WinJS)、iOS(Obj-C 或 Swift)、Android (Java) 和 HTML5 (JavaScript) 的原生 SDK,因此您可以轻松地将任何客户端应用程序连接到它。
  • 该移动服务还支持用 JavaScript 编写的后台作业。这可以用于您的背景“处理部分”,尽管如果没有更多关于您想要做什么的详细信息,很难评估。
  • 您还可以获得对身份验证(Twitter、FB、Google、MSA 和 AD)+ 推送通知(WNS、GCM、APNS 等)的内置支持

在新的预览门户中,移动服务已被应用服务(包括移动)取代,但尚不支持节点后端,因此我建议改用移动服务。您可以通过 ASP.NET WebAPI 后端获得更多控制权,但您还必须自己编写更多后端代码。优点是您可以将数据存储在任何地方(存储表、DocumentDB、SQL DB 等)

对于文件上传/下载,您必须使用 Azure 存储 blob,如果您的移动服务需要对与每个用户关联的文件进行编目,您只需将每个文件的完整 blob“路径”保存在移动服务表中.

Azure 移动服务的文档以及许多教程位于http://azure.microsoft.com/en-us/documentation/services/mobile-services/。我还有 3 个 GitHub 存储库,其中包含与移动服务集成的 Windows、iOS 和 Android 示例代码,位于https://github.com/search?q=user%3AActiveNick+AzureChatr,以及在 http://github.com 上解释它们的博客文章:/ /www.ageofmobility.com/2014/10/06/azurechatr-building-a-cross-platform-chat-app-for-windows-ios-android/

我希望这有帮助。

缺口

于 2015-07-10T16:04:44.673 回答
0

我最终选择了一个 Web API,它让我通过 HTTP 协议从服务器“调用”函数。URL 是函数的“名称”,数据要么在正文中序列化,要么在 URL 中序列化。非常简单和灵活,它应该在任何可以使用 HTTP 的框架上开箱即用,或者我可能能够找到一个让我这样做的库。

我的测试代码如下所示:

客户:

private async Task SubmitJob()
    {

        JobModel job = new JobModel { ID = 42, name = "HelloJob", completion = 100.0f };

        try
        {
            HttpClient client = new HttpClient();
            HttpResponseMessage response = await client.PostAsJsonAsync<JobModel>("http://localhost:53122/Jobs/Submit", job);
            if (response.IsSuccessStatusCode)
                lblSuccess.Text = "Success!";
            else
                lblSuccess.Text = "Failure!";

        }
        catch (Exception ex)
        {
            string s = ex.ToString();
        }
    }

    private async Task GetJobs()
    {
        try
        {
            HttpClient client = new HttpClient();
            HttpResponseMessage response = await client.GetAsync("http://localhost:53122/Jobs/Info");
            if (response.IsSuccessStatusCode)
            {
               List<JobModel> jobList = await response.Content.ReadAsAsync<List<JobModel>>();
               txtConsole.Text = "";
               foreach(var job in jobList)
               {
                   string line = "ID: " + job.ID + " Name: " + job.name + " completion: " + job.completion + "\r\n";
                   txtConsole.Text += line;
               }
            }
            else
            {
                txtConsole.Text = "Failure!";
            }

        }
        catch (Exception ex)
        {
            string s = ex.ToString();
        }
    }

服务器:

        public async Task<IHttpActionResult> GetJobInfo(int jobId)
    {
        try
        {
            JobModel a = new JobModel { name = "jobA", ID = 102, completion = 100.0f };
            JobModel b = new JobModel { name = "jobB", ID = 104, completion = 42.0f };
            JobModel c = new JobModel { name = "jobC", ID = 106, completion = 0.0f };

            List<JobModel> result = new List<JobModel> { a, b, c };
            return Ok(result);
        }
        catch (Exception ex)
        {
            return InternalServerError(ex);
        }
    }

    [HttpPost]
    public async Task<IHttpActionResult> SubmitJob([FromBody] JobModel submitedJob)
    {

        return Ok();
    }
于 2015-07-13T20:23:29.283 回答