web-dev-qa-db-ja.com

Azureカスタムコントローラー/ API .Netバックエンド

AzureでMobileServiceを実行しており、新しいサービスを作成してコードを自分で移行することにしました。新しいサービスは、Azure Mobile App Serviceと呼ばれる新しいタイプのものです。

現在、認証が機能しており、移行/データベースの更新を行うことができます。 TodoItemの例に従っています。 MobileServiceで簡単に機能する独自のカスタムAPIを作成したいのですが、Azure Mobile Appでは機能しません:/

これら2つのリンク 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");

デバッグは、それが正しい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 Accept: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(見つかりません)デバッグメッセージ「要求を完了できませんでした。(見つかりません)」

私は何が欠けています:/?

更新

The mobileApp.csのコードを次のように拡張しようとしました。

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

app-service-backend に基づいていますが、まだアクセスできません:/

更新

Fiddler2を使用してブラウザーからエンドポイントにアクセスすると、次の結果が得られました。

Fiddler output

再度更新

別の最小限のソリューションを作成しようとしましたが、それでも同じエラーが発生します。この機能を実現するために従うことができる素晴らしいチュートリアルはありますか?

ポジティブな気持ちはゆっくりと蒸発しています。 。 。

質問も 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!";
    }

}

これは、投稿機能と取得機能の両方を使用してアクセスします。

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

しかし、貼り付けたコードにはルートがないため、値を使用してアクセスできるのはなぜですか? routeパラメーターを使用しなかった場合、元のコントローラーへのパスはどうなりますか?


追加情報

Microsoftでサポートチケットを作成しました。追加情報を更新します。 。 。うまくいけば。

UpdateMSDNフォーラムからの情報:MS_SkipVersionCheckを試してください属性について読んでください here 、それは適用できないようです。しかし、私はそれを試しました。まだNot Found私のAPIですが、元のAPIはまだ機能しています。したがって、この問題に影響はありませんでした。

31
JTIM

はい !!!

だから私はついに動作するようになりました、私はリドドンナからの使用をコピーしました-msft gitmobileserviceの.netバックエンド を読んでください。

これは次のように終わりました。

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

これは新しいコントローラであり、リディドンナが使用したものとして付属しているものではありません。 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();

そして、私は答えてくれました!

追加情報

作成するコントローラー、つまりクラスはControllerで終わる必要があります。テキストは前でも後でもなくてもかまいません。この情報は MSDNフォーラムディスカッション で提供されました。

postgetの入力が同じ場合、サーバーはNot found。異なる入力を持つことで問題が解決します。

奇妙なInternal Server Error、つまり、サーバーコード全体をステップスルーできますが、返されるすべての変数は初期化されますが、クライアントはエラーを受け取ります。次に、 内部サーバーエラー-Azure App Serviceカスタムコントローラー を参照してください。構成を簡単に修正することで問題を解決できます。

15
JTIM

プロジェクトの構成に何か問題があるはずです。ここに実際のサンプルがあります: https://Gist.github.com/lindydonna/6fca7f689ee72ac9cd2

HttpConfigurationオブジェクトを作成したら、config.MapHttpAttributeRoutes()を呼び出します。ルート属性[Route("api/Test/completeAll")]を追加しました。ルートが正しく登録されていることを確認できます。

この属性をValuesControllerに追加して、ルートを確認してください。

5
lindydonna

属性ルーティングを使用するようになったときに、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);
2
mdorson

本当に奇妙ですが、Azureアプリサービスでは単純なAPIリクエストが機能していません。私はhttpリクエストをc#http post/get、Android post/get、Objective C post/getでテストしましたので、まず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カスタムコントローラーに変更されました。お役に立てれば。

1

継承をApiControllerからTableControllerに切り替えてみてください。

1
viktorh