APIをAzureのAPI管理サービスに接続しています。エンドポイントの1つを呼び出そうとすると、次のエラーが発生します。
{
"statusCode": 500,
"message": "Internal server error",
"activityId": "79c1bef9-a05d-4734-b729-0657c1749e40"
}
トレースを有効にしました。これはトレースjsonです。
{
"traceId": "79c1bef9a05d4734b7290657c1749e40",
"traceEntries": {
"inbound": [
{
"source": "api-inspector",
"timestamp": "2017-10-24T21:50:09.6322945Z",
"elapsed": "00:00:00.0002259",
"data": {
"request": {
"method": "GET",
"url": "https://mysite.Azure-api.net/partner/api/partner/ClientsActions",
"headers": [
{
"name": "Ocp-Apim-Subscription-Key",
"value": "..."
},
{
"name": "Connection",
"value": "Keep-Alive"
},
{
"name": "Host",
"value": "mysite.Azure-api.net"
}
]
}
}
},
{
"source": "api-inspector",
"timestamp": "2017-10-24T21:50:09.6322945Z",
"elapsed": "00:00:00.0002352",
"data": {
"configuration": {
"api": {
"from": "/partner",
"to": null,
"version": null,
"revision": "1"
},
"operation": {
"method": "GET",
"uriTemplate": "/api/partner/ClientsActions"
},
"user": {
"id": "1",
"groups": [
"Administrators",
"Developers"
]
},
"product": {
"id": "57c59e76ea12f3007f060002"
}
}
}
},
{
"source": "cors",
"timestamp": "2017-10-24T21:50:09.6322945Z",
"elapsed": "00:00:00.0002544",
"data": "Origin header was missing or empty and the request was classified as not cross-domain. CORS policy was not applied."
},
{
"source": "choose",
"timestamp": "2017-10-24T21:50:09.6322945Z",
"elapsed": "00:00:00.0002633",
"data": {
"message": "Expression was successfully evaluated.",
"expression": "context.Request.Url.Query.ContainsKey(\"key\")",
"value": false
}
},
{
"source": "set-header",
"timestamp": "2017-10-24T21:50:09.6322945Z",
"elapsed": "00:00:00.0002744",
"data": {
"message": "Expression was successfully evaluated.",
"expression": "(string)context.User.Id",
"value": "1"
}
},
{
"source": "set-header",
"timestamp": "2017-10-24T21:50:09.6322945Z",
"elapsed": "00:00:00.0002802",
"data": {
"message": "Specified value was assigned to the header (see below).",
"header": {
"name": "x-client-id",
"value": "1"
}
}
}
],
"backend": [
{
"source": "forward-request",
"timestamp": "2017-10-24T21:50:09.6322945Z",
"elapsed": "00:00:00.0002909",
"data": {
"message": "Backend service URL is not defined."
}
},
{
"source": "forward-request",
"timestamp": "2017-10-24T21:50:09.6322945Z",
"elapsed": "00:00:00.0004824",
"data": {
"messages": [
null,
"Backend service URL is not defined."
]
}
}
],
"outbound": [
{
"source": "transfer-response",
"timestamp": "2017-10-24T21:50:09.6322945Z",
"elapsed": "00:00:00.0007989",
"data": {
"message": "Response headers have been sent to the caller."
}
},
{
"source": "transfer-response",
"timestamp": "2017-10-24T21:50:09.6322945Z",
"elapsed": "00:00:00.0008730",
"data": {
"message": "Response body streaming to the caller is complete."
}
}
]
}
}
「バックエンドサービスのURLが定義されていません。」メッセージは私には疑わしいように見えますが、それらが何を意味するのかについての情報を見つけることができません。推測しなければならないのであれば、API Managementで実際のAPIとの通信に問題があると思いますが、直接アクセスできます。
誰が何が起こっているのか、私が何を見るべきかについて何か考えがありますか? Azureが提供する開発者ポータルから直接テストを実行しています。
ジェイソン
Swaggerファイルで、正しいHost、basePath、およびschemesエントリが記載されていることを確認してください。 Swashbuckleで生成されたSwaggerファイルには、それらが含まれない傾向があります。
次に例を示します。
{
"swagger": "2.0",
"info": {
"title": "Your title",
"version": "1.0",
"description": "Your description"
},
"Host": "server.Host.com",
"basePath": "/api",
"schemes": [
"https"
],
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
「Host」、「basePath」、「schemes」に特に関心を持ち、APIに応じてそれらを変更します。
私も同じ問題を抱えていました。 APIManagementのAPIの「WebサービスURL」にバックエンドAPIURLを配置することで解決しました。したがって、執筆時点では、ポータルを使用する手順は次のようになります。
API管理でエンドポイントを構成しているときに、同様のエラーが発生しました。これは、API管理がSSL証明書のルート権限チェーンを検証できない場合に発生します。自己署名証明書を使用している場合は、以下のPowerShellを使用して、エンドポイントの証明書チェーンの検証をスキップします。
$subscriptionName = "MySubscription"
Get-AzureRmSubscription -SubscriptionName $subscriptionName | Set-AzureRmContext
$context = New-AzureRmApiManagementContext -resourcegroup 'myResourceGroup' -servicename 'myApiManagementServiceName'
New-AzureRmApiManagementBackend -Context $context -Url 'https://myService.abc.com/' -Protocol http -SkipCertificateChainValidation $true
これで問題が解決することを願っています。
証明書チェーンの検証をスキップするように設定されているURLを確認する必要がある場合は、以下のPowerShellコマンドを使用してください-
Get-AzureRmApiManagementBackend -Context $context
最近、私はこの問題に遭遇しました。 apiからjsonファイルのメタデータを作成するためにSwashbuckle.AspNetCoreを使用していました。Host、schemes、securityDefinitions、apiKeyQueryなどのフィールドが何らかの理由で欠落しています。理由はわかりません。しかし、それらを明示的に追加した後、問題は解決しました。不足しているフィールドの下
"Host": "your api Host .com",
"schemes": ["http", "https"],
"securityDefinitions": {
"apiKeyHeader": {
"type": "apiKey",
"name": "Ocp-Apim-Subscription-Key",
"in": "header"
},
"apiKeyQuery": {
"type": "apiKey",
"name": "subscription-key",
"in": "query"
}
},
"security": [{
"apiKeyHeader": []
}, {
"apiKeyQuery": []
}],