Подтвердить что ты не робот

Интерфейс Azure Custom Controller/API.Net

У меня была мобильная служба, работающая на Azure, и я решил создать новую услугу и сам перенести код. Новая услуга относится к новому типу: Azure Mobile App Service.

В настоящее время я работаю с проверкой подлинности и могу выполнять миграцию/обновление базы данных. Я следую примеру TodoItem. Теперь я хочу создать свой собственный пользовательский API, который легко работал на MobileService, но я не могу заставить его работать над Azure Mobile App:/

Я следил за этими двумя ссылками web-Api-routing и приложение-сервис -Мобильный-бэкенд. И теперь у меня есть следующее:

Я создал новый контроллер:

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

Отладка показывает, что это правильный URL:

{Метод: POST, RequestUri: 'https://xxxxxxx.azurewebsites.net/api/Тест/completeAll", Версия: 1.1, Содержимое: System.Net.Http.StringContent, Заголовки: {X-ZUMO-ОСОБЕННОСТИ: AT X-ZUMO-INSTALLATION-ID: e9b359df-d15e-4119-a4ad-afe3031d8cd5 X-ZUMO-AUTH: xxxxxxxxxxx Принять: application/json User-Agent: Пользовательский агент 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-VERSION: 2.0.0 Content-Type: application/json; charset = utf-8 Content-Length: 3}}

Но продолжайте получать: 404 (не найдено) Debug Message "Запрос не может быть выполнен. (Не найдено)"

Что мне не хватает:/?

Обновление

Я попытался расширить код в MobileApp.cs, используя:

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

на основе app-service-backend, однако все же нет доступа:/

Update

Я использовал fiddler2 для доступа к конечной точке через браузер и получил следующие результаты:

Выход Fiddler

Обновить снова

Я попытался создать еще одно минимальное решение, но все равно получаю ту же ошибку. Есть ли какие-нибудь большие учебники, которые я могу выполнить для достижения этой функциональности?

Положительное чувство медленно испаряется.,

Вопрос также выполняется теперь на msdn, здесь я обновляюсь, если там отображается какая-либо информация.


Update

Протестировано замечание Линды, и я действительно могу получить доступ к конвертеру значений:

// 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, но исходный все еще работает. Таким образом, это не повлияло на эту проблему.

4b9b3361

Ответ 1

Да!!!

Итак, я, наконец, начал работать, я скопировал записи из lidydonna - msft git и читал о .NET backend для 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();

И Я ПРИНИМАЮ ОТ ОТВЕТСТВЕННОСТИ YAY!!

Дополнительная информация

Создаваемые вами контроллеры, то есть класс должен заканчиваться на Controller, вы можете иметь текст до, но не после. Эта информация была предоставлена ​​на Обсуждение форума MSDN.

Если теги post и get имеют одинаковый ввод, сервер возвращает Not found. Наличие разных входов решает проблему.

В случае странного Internal Server Error, т.е. странно, вы можете пройти весь код сервера, все переменные, которые вы хотите вернуть, инициализируются, но клиент получает ошибку. Затем обратитесь к Внутренняя ошибка сервера - Пользовательский контроллер Azure App Service, где может быть устранена проблема с простым исправлением конфигурации.

Ответ 2

У вас должно быть что-то не так в вашей конфигурации проекта. У меня есть рабочий образец здесь: https://gist.github.com/lindydonna/6fca7f689ee72ac9cd20

После создания объекта HttpConfiguration вызовите config.MapHttpAttributeRoutes(). Я добавил атрибут маршрута [Route("api/Test/completeAll")], и я могу подтвердить, что маршрут зарегистрирован правильно.

Попробуйте добавить этот атрибут в ValuesController и проверить маршрут.

Ответ 3

Попробуйте переключить наследование с ApiController на TableController.

Ответ 4

Я нашел еще одну причину ошибок 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);

Ответ 5

Это действительно странно, но простой запрос API не работает в службе azure app Поэтому у меня есть решение, которое работает для меня. Я протестировал HTTP-запросы с помощью С# http post/get, android post/get и объективного сообщения C/get Поэтому, прежде всего, вам нужно обновить свой класс Startup.MobileApp.cs:

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

Затем создайте пользовательский контроллер Azure Mobile App. После этого немного измените ваш контроллер, чтобы получить правильный ответ 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 и API API WEB теперь изменен на azure custom controller. Надеюсь это поможет.