31

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

目前我有身份验证工作,可以做迁移/更新数据库。我正在关注 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 我根据后端添加了以下代码:

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

另外,我根据web-api-routing安装了以下软件包:

Microsoft.AspNet.WebApi.WebHost 

以及来自客户的电话:

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

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

{方法:POST,RequestUri:' https://xxxxxxx.azurewebsites.net/api/Test/completeAll ',版本:1.1,内容:System.Net.Http.StringContent,标头:{ X-ZUMO-FEATURES:AT X -ZUMO-INSTALLATION-ID: e9b359df-d15e-4119-a4ad-afe3031d8cd5 X-ZUMO-AUTH: xxxxxxxxxxx 接受: application/json 用户代理: ZUMO/2.0 用户代理: (lang=Managed; os=Windows Store; os_version =--;arch=Neutral;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 版本:2.0.0 内容类型:应用程序/json;charset=utf-8 内容长度:3}}

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

我错过了什么:/?

更新

我曾尝试扩展 The mobileApp.cs 中的代码,其中包括:

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

基于app-service-backend,但仍然无法访问:/

更新

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

提琴手输出

再次更新

我试图创建另一个最小的解决方案,但仍然得到同样的错误。有没有我可以遵循的很棒的教程来实现这个功能?

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

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


更新

测试了 Lindas 的评论,我实际上可以访问值转换器:

// 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!";
    }

}

我使用 post 和 get 函数访问:

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);

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


额外的信息

我现在已经创建了 Microsoft 的支持票证,并将更新更多信息。. . 希望。

来自 MSDN 论坛的更新 信息:尝试 MS_SkipVersionCheck 在此处阅读有关该属性的信息,它似乎不适用。但我试过了。仍然Not Found适用于我的 API,但原来的 API 仍在工作。所以对这个问题没有影响。

4

5 回答 5

15

是的 !!!

所以我终于让它工作了,我从lidydonna-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 使用的那样附带的控制器。似乎它既想要函数get又想要post. 这导致 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();

我得到了回应耶!!

额外的信息

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

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

在奇怪的情况下Internal Server Error,即奇怪的情况下,您可以单步执行整个服务器代码,所有要返回的变量都被初始化,但客户端会收到错误。然后参考内部服务器错误 - Azure 应用服务自定义控制器,其中对配置的简单修复可以解决问题。

于 2016-03-17T19:33:29.757 回答
5

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

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

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

于 2016-03-16T20:37:27.120 回答
2

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

上面的代码最初在 mobileApp.cs 中有这个:

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

config.MapHttpAttributeRoutes() 需要移到 .ApplyTo 上方:

HttpConfiguration config = new HttpConfiguration();
 config.MapHttpAttributeRoutes();
 new MobileAppConfiguration()
        .UseDefaultConfiguration().MapApiControllers()
        .ApplyTo(config);
于 2017-06-07T03:32:14.530 回答
1

尝试将继承从 ApiController 切换到 TableController。

于 2016-03-03T11:55:23.470 回答
1

这真的很奇怪,但简单的 API 请求在 azure app 服务中不起作用所以我找到了对我有用的解决方案。我已经使用 c# http post/get、android post/get 和 Objective C post/get 测试了 http 请求所以首先你需要更新你的 Startup.MobileApp.cs 类:

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

然后创建Azure Mobile App Custom Controller。之后稍微修改你的控制器以获得正确的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!";
    }
}

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

于 2017-05-09T12:26:05.173 回答