Azure自定义控制器/API.Net后端

我在Azure上运行了一个MobileService,并决定创建一个新的服务,然后自己迁移代码。新服务属于新类型,称为:Azure移动应用程序服务

目前我正在进行身份验证,可以迁移/更新数据库。我遵循TodoItem的例子。我现在想创建自己的自定义API,它可以轻松地在MobileService上运行,但我无法在Azure移动应用程序上运行:/

我遵循了web Api路由和应用程序服务移动后端这两个链接。我现在有以下几点:

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

[MobileAppController]
公共类TestController:ApicController
{
//获取api/测试
[路线(“api/Test/completeAll”)]
[HttpPost]
公共异步任务<ihttpactionresult>completeAll(字符串信息)
{
返回Ok(信息+信息+信息);
}
}

在mobileApp.cs中,我根据后端添加了以下代码:

HttpConfiguration config=新的HttpConfiguration();
config.maphttpAttribute路由();

此外,我还根据web api路由安装了以下软件包:

Microsoft.AspNet.WebApi.WebHost

以及来自客户的呼叫:

string t=wait App.MobileService.InvokeApiAsync<字符串,字符串>(“测试/完成所有”、“hej”);

调试显示,它是正确的URL:

{方法:POST,请求URI:’https://xxxxxxx.azurewebsites.net/api/Test/completeAll’,
版本:1.1,内容:System.Net.Http.StringContent,标题:{X-ZUMO-FEATURES:
在X-ZUMO-INSTALLATION-ID:e9b359df-d15e-4119-a4ad-afe3031d8cd5 X-ZUMO-AUTH:
XXXXXXXXXX接受:应用程序/json用户代理:
ZUMO/2.0用户代理:(lang=Managed;os=Windows应用商店;os_版本=–;arch=Neutral;版本=2.0.31125.0)
X-ZUMO-VERSION:ZUMO/2.0(lang=Managed;os=Windows应用商店;os_VERSION=–;arch=Neutral;VERSION=2.0.31125.0)
ZUMO-API-VERSION:2.0.0内容类型:application/json;charset=utf-8内容长度:3}

但继续获得:404(未找到)
调试消息“请求无法完成。(未找到)”

我错过了什么:/

更新

我尝试在mobileApp.cs中扩展代码,包括:

HttpConfiguration config=新的HttpConfiguration();
新的MobileAppConfiguration()
.UseDefaultConfiguration().MapapicController()
.ApplyTo(配置);
config.maphttpAttribute路由();
app.UseWebApi(配置);

基于应用程序服务后端,但仍然无法访问:/

更新

我使用fiddler2通过浏览器访问端点,结果如下:

再次更新

我试图创建另一个最小解决方案,但仍然得到相同的错误。有没有什么好的教程可以让我按照来实现这个功能

积极的感觉正在慢慢消失

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


更新

测试了Lindas注释,事实上我可以访问值转换器:

//为要使用的每个ApicController使用MobileAppController属性
//来自您的移动客户端
[MobileAppController]
公共类值控制器:ApiController
{
//获取api/值
公共字符串Get()
{
MobileAppSettingsDictionary设置=this.Configuration.GetMobileAppSettingsProvider().GetMobileAppSettings();
ITraceWriter traceWriter=this.Configuration.Services.GetTraceWriter();
字符串host=settings.HostName??“localhost”;
string greeting=“Hello from”+主机;
traceWriter.Info(问候语);
回敬问候;
}
//后api/值
公共字符串Post()
{
返回“你好,世界!”;
}
}

我可以使用post和get功能访问此文件:

string t=wait App.MobileService.InvokeApiAsync<字符串,字符串>(“值”,null,HttpMethod.Post,null);

string t=wait App.MobileService.InvokeApiAsync<字符串,字符串>(“values”,null,HttpMethod.Get,null);

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


额外信息

我现在已经与Microsoft创建了一个支持票证,并将使用其他信息进行更新。希望如此

更新
来自MSDN论坛的信息:请尝试MS_SkipVersionCheck
阅读这里的属性,它似乎不适用。但我试过了。仍然未找到我的API的,但原始API仍在工作。所以它对这个问题没有影响

是的

所以我终于让它工作了,我从lidydonna-msft git复制了usings,并阅读了有关mobileservice的.net后端

结果如下:

使用System.Web.Http;
使用Microsoft.Azure.Mobile.Server.Config;
使用System.Threading.Tasks;
使用System.Web.Http.Tracing;
使用Microsoft.Azure.Mobile.Server;
命名空间BCMobileAppService.Controllers
{
[MobileAppController]
公共类TestController:ApicController
{
//获取api/测试
[HttpGet,路由(“api/Test/completeAll”)]
公共字符串Get()
{
MobileAppSettingsDictionary设置=this.Configuration.GetMobileAppSettingsProvider().GetMobileAppSettings();
ITraceWriter traceWriter=this.Configuration.Services.GetTraceWriter();
字符串host=settings.HostName??“localhost”;
string greeting=“Hello from”+主机;
traceWriter.Info(问候语);
回敬问候;
}
//后api/值
[HttpPost,路由(“api/Test/completeAll”)]
公共字符串Post(字符串hej)
{
string retVal=“你好,世界!”+hej;
返回返回;
}
}
}

这是一个新的控制器,而不是lidydonna使用的控制器。它似乎需要两个函数getpost。这导致API已注册并可以访问。这意味着对我使用的服务器的客户端调用是:

t=wait App.MobileService.InvokeApiAsync<字符串,字符串>(“Test/completeAll”,null,HttpMethod.Post,newdictionary<string,string>({{“hej”,“AWESOME!”});
dialog=新消息dialog(t);
添加(新的UICommand(“OK”);
wait dialog.ShowAsync();

我得到了回应耶

额外信息

您创建的控制器,即类需要以Controller结尾,可以在前面有文本,但不能在后面有文本。此信息在MSDN论坛讨论中给出

如果postget具有相同的输入,服务器将返回notfound。有不同的投入可以解决这个问题

如果出现奇怪的内部服务器错误,也就是说,你可以单步执行整个服务器代码,你想返回的所有变量都被初始化了,但是客户端收到了错误。然后,请参阅内部服务器错误-Azure应用程序服务自定义控制器,其中简单的配置修复可以解决此问题

发表评论