2017-07-27 19 views
0

私は、HTTPリクエストを受け取り、HTTPリクエストを返すAzure関数を作成しました。関数:Azure関数 - ファイルを含むテンプレートをルート

  1. がn分で期限切れに共有アクセス署名付きブロブストレージ内の位置へ
  2. はURIを作成し、HTTP要求を受け入れ/時間
  3. ロケーション・ヘッダセットで302個のステータスコードを返しn分/時間で有効期限が切れるURIへ

クエリパラメータにBLOBのパスを配置したときにこれを動作させることはできましたが、その変数がルートテンプレートに含まれていると失敗します。

私はルートテンプレート:storage/{containerName:alpha}/{path:alpha}を作成しようとしましたが、常に404を返します。以下はリクエストの作成方法の例です。

GET /api/storage/example-container-name/example.jpg?code=SSBhbSBhIHRlYXBvdCwgZG8geW91IHRoaW5rIEkgd291bGQgcHV0IGEgcGFzc3dvcmQgaGVyZT8= HTTP/1.1 
Host: hostdoesnotexist.azurewebsites.net  
Cache-Control: no-cache 

は**注意:ホストが本物ではない、パスとコードが本物ではありません*

私はプロキシが同じことをやっAzureの機能に関連していた、この質問が、この質問を見つけました。関数には適用されません。

Azure Functions Proxy - route to storage account

このAzure Functions HTTP and webhook bindings例を使用して、HTTPエンドポイント部カスタマイズまでスクロール、私は次のコードで別の機能を作成した:

Function.json - idがINTから変更?ルートは、製品/テスト/ ABCDであれば、それはで応答

{ 
    "bindings": [ 
    { 
     "name": "req", 
     "type": "httpTrigger", 
     "direction": "in", 
     "methods": [ 
     "get" 
     ], 
     "route": "products/{category:alpha}/{id:alpha}", 
     "authLevel": "function" 
    }, 
    { 
     "name": "$return", 
     "type": "http", 
     "direction": "out" 
    } 
    ], 
    "disabled": false 
} 

run.csx

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, 
                string category, 
                string id, 
                TraceWriter log) 
{ 
    if (id == null) 
     return req.CreateResponse(HttpStatusCode.OK, $"All {category} items were requested."); 
    else 
     return req.CreateResponse(HttpStatusCode.OK, $"{category} item with id = {id} has been requested."); 
} 

アルファに:

200 - 「idのテスト項目= ABCが要求されました"

しかし、あなたが製品/テスト/ abcd.jpgにこれを変更した場合、それはで応答:

404 - あなたが探しているリソースは削除されましたが、その名前が変更された、または現在利用でき。

これは私が作成した他の関数で見ているのと同じ動作です。

これはプロキシの例のようなバグか、私のルートが違って見えるかどうかは知りませんか?この場合も、クエリパラメータを使用して作業していますが、変数をルートテンプレートに移動すると失敗します。

編集 - フィードバック function.json

{ 
    "bindings": [ 
    { 
     "name": "req", 
     "type": "httpTrigger", 
     "direction": "in", 
     "methods": [ 
     "get" 
     ], 
     "route": "products/{category:alpha}", 
     "authLevel": "function" 
    }, 
    { 
     "name": "$return", 
     "type": "http", 
     "direction": "out" 
    } 
    ], 
    "disabled": false 
} 

run.csx

using System.Net; 

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, 
                string category, 
                TraceWriter log) 
{ 
    string id = req.GetQueryNameValuePairs() 
     .FirstOrDefault(q => string.Compare(q.Key, "id", true) == 0) 
     .Value; 


    if (id == null) 
     return req.CreateResponse(HttpStatusCode.OK, $"All {category} items were requested."); 
    else 
     return req.CreateResponse(HttpStatusCode.OK, $"{category} item with id = {id} has been requested."); 
} 

プロキシに基づいて追加されたファイル。JSON

{ 
    "$schema": "http://json.schemastore.org/proxies", 
    "proxies": { 
     "GetJustArtinAroundStorageLinkProxy": { 
      "matchCondition": { 
       "route": "/products/{category:alpha}/{id}", 
       "methods": [ 
        "GET" 
       ] 
      }, 
      "backendUri": "https://<company-name>.azurewebsites.net/api/products/{category:alpha}?id={id}" 
     } 
    } 
} 

答えて

2

は現在、HttpTriggerとの制限があり、それは(詳細については、thisを参照)拡張子の要求をサポートしていません。

問題で述べたように、プロキシを使用してこの制限を回避することはできますが、経路からalphaの制約を削除する必要があります。

ここでは、クエリ文字列として上記持っid転送する例プロキシの設定です:

{ 
    "$schema": "http://json.schemastore.org/proxies", 
    "proxies": { 
     "Test": { 
      "matchCondition": { 
       "route": "products/{category}/{id}" 
      }, 
      "backendUri": "https://<functionapp>.azurewebsites.net/api/<function>?id={id}" 
     } 
    } 
} 

あなたの要件に合うように上記を調整することができますが、これはあなたが探している動作を与える必要がありますが、ために。

+0

これは動作していないようです。 500 - 内部サーバーエラーを返します。私は、xファンクションキーのヘッダとコードクエリパラメータの両方のキーを関数に渡しました。さらに、{category:alpha}はダッシュを許可していないので、 'break-pads'のようなものは404を返します。ロブを有効にしてBLOBストレージにプッシュしようとしましたが、表示されません働くこと。私のログコンテナは空のままです。 – Rogala

+0

フィードバックに基づいて質問を詳細に更新しました。 – Rogala

+0

私は上記の設定でテストしたが、問題は発生しなかった。プロキシを経由しない直接URLを使用して関数を呼び出せますか?呼び出しID、地域、エラーのおおよその時間を共有できますか?ログを確認できますか? –

関連する問題