微软Azure服务最适合我

本文关键字:Azure 服务 微软 | 更新日期: 2023-09-27 18:01:59

我主要是一个低级别的系统开发人员,所以我有点迷失在Azure提供的那些高级工具和所有那些流行词汇中。

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

  • 登录用户

  • 上传/下载选定文件

  • 管理当前运行的作业或启动一些新作业

客户端应用程序可能在iPad、Web浏览器、PC等…服务器端可能会出现或更改新功能。这就是为什么我选择一个"服务器接口"来标准化所有客户端交互,但我不知道什么Azure工具能满足我对这个接口的需求。我不是在寻找一些低水平的东西,因为在构建我自己的协议和服务器,只是一些东西,可以简单地完成工作。

欢呼Leon Cantin

微软Azure服务最适合我

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

  • 移动服务自动创建一个nosql风格的表(认为它实际上存储在后台的SQL Azure DB中),并为CRUD暴露REST端点,以及每个端点的可定制脚本。
  • Mobile Services具有Windows (c#或WinJS), iOS (Obj-C或Swift), Android (Java)和HTML5 (JavaScript)的本机sdk,因此您可以轻松地将任何客户端应用程序连接到它。
  • 移动服务还支持用JavaScript编写的后台作业。这可以用于你的后台"处理部分",尽管如果没有更多关于你想做什么的细节,很难评估。
  • 您还可以获得内置的认证支持(Twitter, FB, Google, MSA和AD) +推送通知(WNS, GCM, APNS等)

在新的预览门户中,移动服务被App services(包括移动)取代,但节点后端还不支持,因此我建议使用移动服务。使用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://www.ageofmobility.com/2014/10/06/azurechatr-building-a-cross-platform-chat-app-for-windows-ios-android/。

我希望这对你有帮助。

尼克

我最终选择了一个允许我通过HTTP协议从服务器"调用"函数的Web API。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();
    }