我主要是一个低级别的系统开发人员,所以我对Azure提供的所有高级工具以及所有那些流行语都感到很遗憾。
所以这就是我要构建的内容:我正在构建一个具有处理部分(可能使用Azure Batch)和存储部分(使用存储,duh和DB)的服务器。我想在客户端应用程序可以接口的界面后隐藏所有这些:
登录用户
上传/下载所选文件
管理当前正在运行的作业或启动一些新作业
客户端应用程序可能位于iPad,Web浏览器,PC等上......服务器端可能会出现或更改新功能。 这就是选择“服务器接口”来标准化所有客户端交互的原因,但我不知道哪种Azure工具适合我对此接口的需求。我不是在寻找低级别的东西。建立我自己的协议和服务器,只是简单地完成工作。
干杯
LéonCantin
答案 0 :(得分:2)
Azure移动服务可能非常适合这里。好处是你可以快速原型。在当前门户中,您可以将Mobile Services与Node / JavaScript后端或ASP.NET WebAPI后端一起使用。节点选项是最快/最容易实现的。这种方法的一些好处:
在新的预览门户中,移动服务被App Services(包括移动设备)取代,但尚不支持节点后端,因此我建议使用移动服务。使用ASP.NET WebAPI后端可以获得更多控制权,但您还必须自己编写更多后端代码。优点是您可以将数据存储在任何位置(存储表,DocumentDB,SQL DB等)
对于文件上传/下载,您必须使用Azure存储blob,如果您的移动服务需要编目与每个用户关联的文件,您只需为每个文件保存完整blob“路径”。移动服务表。
Azure移动服务的文档以及许多教程均位于http://azure.microsoft.com/en-us/documentation/services/mobile-services/。我还有3个GitHub repos,包含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/解释了它们。
我希望这会有所帮助。
尼克
答案 1 :(得分:0)
我最终选择了一个Web API,让我可以打电话给#34;来自服务器的功能通过HTTP protocole。 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();
}