2016-03-01 24 views
28

我有一个在Azure上运行的MobileService,并决定创建一个新服务并自行迁移代码。这项新服务属于名为Azure Mobile App Service的新型服务。Azure自定义控制器/ API .Net后端

目前我有认证工作,并可以做迁移/更新数据库。我遵循TodoItem示例。我现在想创建自己的自定义API,这就容易在MobileService工作,但我不能让它在Azure移动应用工作:/

我按照这两个环节web-Api-routingapp-service-mobile-backend。我现在有以下几点:

我已创建一个新的控制器:

[MobileAppController] 
public class TestController : ApiController 
{ 
    // GET api/Test 
    [Route("api/Test/completeAll")] 
    [HttpPost] 
    public async Task<ihttpactionresult> completeAll(string info) 
    { 
     return Ok(info + info + info); 
    } 
} 

在mobileApp.cs我已经根据backend加入下面的代码:

HttpConfiguration config = new HttpConfiguration(); 
config.MapHttpAttributeRoutes(); 

另外我有根据web-api-routing安装以下包装:

Microsoft.AspNet.WebApi.WebHost 

和来自客户端的呼叫:

string t = await App.MobileService.InvokeApiAsync<string,string>("Test/completeAll", "hej"); 

调试后,这是正确的网址:

{方法:POST,RequestUri: 'https://xxxxxxx.azurewebsites.net/api/Test/completeAll', 版本:1.1,内容:系统.Net.Http.StringContent,Headers:{X-ZUMO-FEATURES: AT X-ZUMO-INSTALLATION-ID:e9b359df-d15e-4119-a4ad-afe3031d8cd5 X-ZUMO-AUTH: xxxxxxxxxxx Accept:application/json User-代理: ZUMO/2.0 User-Agent:(lang = Managed; os = Windows Store; OS_VERSION = - ;拱=中性;版本= 2.0.31125.0) X-ZUMO -VERSION:ZUMO/2.0(lang = Managed; os = Windows Store; os_version = - ; arch = Neutral; version = 2.0.31125.0) ZUMO-API-VERSION:2.0。 0 Content-Type:application/json;字符集= UTF-8的Content-Length:3}}

但不断收到:404(未找到) 调试信息 “无法完成请求(未找到)”

我是什么失踪 :/ ?

更新

我试图扩大其在一个MobileApp代码。CS,有:

HttpConfiguration config = new HttpConfiguration(); 
     new MobileAppConfiguration() 
      .UseDefaultConfiguration().MapApiControllers() 
      .ApplyTo(config); 
     config.MapHttpAttributeRoutes(); 
     app.UseWebApi(config); 

基于app-service-backend,但仍然没有进入:/

更新

我用fiddler2通过浏览器访问端点,得到了以下结果:

Fiddler output

再次更新

我试图创建另一个最小的解决方案,但仍然得到相同的错误。有什么伟大的教程,我可以遵循实现这一功能?

积极的感觉正在慢慢蒸发。 。 。

现在问题也在msdn上运行,如果有任何信息显示,我将在此更新。


更新

测试林多斯评论,我其实是可以访问的值转换器:

// Use the MobileAppController attribute for each ApiController you want to use 
// from your mobile clients 
[MobileAppController] 
public class ValuesController : ApiController 
{ 
    // GET api/values 
    public string Get() 
    { 
     MobileAppSettingsDictionary settings = this.Configuration.GetMobileAppSettingsProvider().GetMobileAppSettings(); 
     ITraceWriter traceWriter = this.Configuration.Services.GetTraceWriter(); 

     string host = settings.HostName ?? "localhost"; 
     string greeting = "Hello from " + host; 

     traceWriter.Info(greeting); 
     return greeting; 
    } 

    // POST api/values 
    public string Post() 
    { 
     return "Hello World!"; 
    } 

} 

使用这两个职位,并得到功能这个我访问:

string t = await App.MobileService.InvokeApiAsync<string, string>("values", null, HttpMethod.Post, null); 

string t = await App.MobileService.InvokeApiAsync<string, string>("values", null, HttpMethod.Get, null); 

但我粘贴的代码没有路由,为什么我可以使用值来访问它?如果没有使用路由参数,那么路径对于原始控制器会是什么?


额外信息

我现在已经创建了一个支持票与微软将提供更多的信息更新。 。 。希望。从MSDN论坛

更新 信息:尝试MS_SkipVersionCheck 阅读有关属性here,它似乎并不适用。但我试过了。我的API仍为Not Found,但原始的仍在工作。所以它对这个问题没有影响。

+0

当您尝试直接使用Fiddler点击端点时,您是否还获得404? –

+0

@ lindydonna-msft我已经更新了这个问题,但是我仍然得到了404。 – JTIM

+0

尝试重建您的解决方案,并且当您发布时,选中“删除目标上的其他文件”。另外,请确保您使用的是最新版本的服务器SDK,当前版本为1.1.157。 https://www.nuget.org/packages/Microsoft.Azure.Mobile.Server/ –

回答

10

是的!!!

因此,我终于得到它的工作,我复制了从利多的使用 - msft git并阅读约.net backend for mobileservice

这结束了以下内容:

using System.Web.Http; 
using Microsoft.Azure.Mobile.Server.Config; 
using System.Threading.Tasks; 
using System.Web.Http.Tracing; 
using Microsoft.Azure.Mobile.Server; 

namespace BCMobileAppService.Controllers 
{ 
[MobileAppController] 
public class TestController : ApiController 
{ 
    // GET api/Test 
    [HttpGet, Route("api/Test/completeAll")] 
    public string Get() 
    { 
     MobileAppSettingsDictionary settings = this.Configuration.GetMobileAppSettingsProvider().GetMobileAppSettings(); 
     ITraceWriter traceWriter = this.Configuration.Services.GetTraceWriter(); 

      string host = settings.HostName ?? "localhost"; 
      string greeting = "Hello from " + host; 

      traceWriter.Info(greeting); 
      return greeting; 
     } 

     // POST api/values 
     [HttpPost, Route("api/Test/completeAll")] 
     public string Post(string hej) 
     { 
      string retVal = "Hello World!" + hej; 
      return retVal; 
     } 
    } 
} 

这是一个新的控制器而不是使用lidydonna随之而来的一个。它好像想要功能getpost。这导致API被注册并可被访问。这意味着我使用的服务器的客户端呼叫是:

t = await App.MobileService.InvokeApiAsync<string, string>("Test/completeAll", null, HttpMethod.Post, new Dictionary<string, string>() { { "hej", " AWESOME !" }}); 

dialog = new MessageDialog(t); 
dialog.Commands.Add(new UICommand("OK")); 
await dialog.ShowAsync(); 

而且我得到了回应YAY !!

额外信息

您创建的控制器,即类需要与Controller结束,你可以有文字之前,但不是之后。该信息在MSDN forum discussion上给出。

如果postget具有相同的输入,则服务器返回Not found。有不同的投入解决了这个问题。

如果奇怪Internal Server Error,即奇怪,你可以遍历整个服务器代码,所有你想要返回的变量被初始化,但客户端收到错误。然后参考Internal Server Error - Azure App Service Custom Controller,在这里简单地修复配置可以解决问题。

+1

你吓坏了摇滚! –

+1

没有ZUMO-API-VERSION头文件,它仍然不起作用:http://go.microsoft.com/fwlink/?LinkId = 690568#2.0。0 – AFD

+0

@AFD我认为这是在您使用Azure命令'InvokeApiAsync()'时处理的?至少这没有给我任何问题。你能描述你如何访问API? – JTIM

1

尝试切换从ApiController继承到TableController。

+0

我会稍后再试。但是在文档中明确指出它应该是ApiController?但我会给它一个:) – JTIM

+0

@viktoh代码编译并可以发布,但错误仍然存​​在,所以不幸的不是解决方案:/ – JTIM

+0

对于这个用例,ApiController实际上更合适。 –

3

您的项目配置中必须有错误。我在这里有一个工作示例:https://gist.github.com/lindydonna/6fca7f689ee72ac9cd20

创建HttpConfiguration对象后,请致电config.MapHttpAttributeRoutes()。我添加了路线属性[Route("api/Test/completeAll")],我可以确认路线已正确注册。

尝试将此属性添加到ValuesController并检查路由。

+0

我已经复制了你的使用陈述。我有时可能会得到太多的链接到相同的地址(好吧,他们存在)。删除干净上传新的一个,只有一个路由,错误返回'未找到'。 而不是有'任务<>'我改变它得到设置功能,但现在我得到的方法不允许。我可以简单地不明白这里的服务器有什么问题:/ – JTIM

0

这真的很奇怪,但简单的API请求无法在蔚蓝应用服务 所以我找出了解决方案已经为我工作。我测试用C http请求#HTTP POST /获取,Android的岗位/ get和目标C柱/获得 所以首先你需要更新你的Startup.MobileApp.cs类:

new MobileAppConfiguration() 
    .UseDefaultConfiguration() 
    .MapApiControllers()    /* /api endpoints **missing part***/ 
    .ApplyTo(config); 

然后创建Azure移动应用程序自定义控制器。之后修改点点控制器得到适当的JSON响应

public class Mes 
    { 
     public string message { get; set; } 
    } 

    // GET api/My 
    public Mes Get() 
    { 

     return new Mes { message = "thanks" }; 


     // return "Hello from custom controller!"; 
    } 
    // POST api/My 
    public Mes Post(Mes chal) 
    { 

     return new Mes { message = chal.message + "asnwer" }; 


     // return "Hello from custom controller!"; 
    } 
} 

你可以简单的离开第一个变体,并得到响应,但目标C会告诉你,JSON文字不与数组或对象和选项来启动允许片段...等等。发生这种情况是因为您获取简单的字符串不是对象。所以这就是为什么我用类Mes 修改了我的回答。但是,这也取决于您如何提出请求以及您期望的对象类型。 所以.MapApiControllers()它是API的主键,而WEB API控制器现在更改为azure自定义控制器。 希望这有助于。

1

我发现了使用属性路由时出现404错误的另一个原因。

上述代码在mobileApp.cs原本有这样的:

HttpConfiguration config = new HttpConfiguration(); 
    new MobileAppConfiguration() 
     .UseDefaultConfiguration().MapApiControllers() 
     .ApplyTo(config); 
    config.MapHttpAttributeRoutes(); 
    app.UseWebApi(config); 

的config.MapHttpAttributeRoutes()需要上面的移动。应用于:

HttpConfiguration config = new HttpConfiguration(); 
config.MapHttpAttributeRoutes(); 
new MobileAppConfiguration() 
     .UseDefaultConfiguration().MapApiControllers() 
     .ApplyTo(config);