Azure 사용자 지정 컨트롤러 / API.네트 백엔드
저는 Azure에서 모바일 서비스를 실행하고 있으며, 새로운 서비스를 만들고 코드를 직접 마이그레이션하기로 결정했습니다.새로운 서비스는 Azure Mobile App Service라고 불리는 새로운 유형입니다.
현재 인증 작업 중이며 마이그레이션/업데이트 데이터베이스를 수행할 수 있습니다.나는 TodoItem의 예를 따르고 있습니다.이제 모바일 서비스에서 쉽게 작동하는 나만의 커스텀 API를 만들고 싶지만, Azure Mobile App에서 작동할 수 없습니다 :/
저는 웹-Api-라우팅과 앱-서비스-모바일-백엔드 두 가지 링크를 따라왔습니다.이제는 다음과 같은 기능이 있습니다.
새 컨트롤러를 만들었습니다.
[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, 내용:시스템.넷. http.문자열 내용, 헤더:{X-ZUMO-기능: AT X-ZUMO-INSTALLATION-ID: e9b359df-d15e-4119-a4ad-afe3031d8cd5 X-ZUMO-AUTH: xxxxxxxxxxx 수락: 응용 프로그램/json 사용자 에이전트: ZUMO/2.0 사용자 버전: = arch_2.31 = managentral 버전: = 저장소(Windows_0.31)0 (lang=Managed, os=Windows Store, os_version=--; arch=Neutral, 버전=2.0.31125.0) ZUMO-API-VERSION: 2.0 콘텐츠 유형: application/json, charset=utf-8 콘텐츠 길이: 3}
그러나 계속 표시: 404(찾을 수 없음) 디버그 메시지 "요청을 완료할 수 없습니다.(찾을 수 없음)"
내가 무엇을 놓쳤습니까 :/?
갱신하다
저는 mobileApp.cs 에서 다음과 같이 코드를 확장해 보았습니다.
HttpConfiguration config = new HttpConfiguration();
new MobileAppConfiguration()
.UseDefaultConfiguration().MapApiControllers()
.ApplyTo(config);
config.MapHttpAttributeRoutes();
app.UseWebApi(config);
app-service-provider를 기반으로 하지만 여전히 액세스할 수 없음:/
갱신하다
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!";
}
}
게시 및 가져오기 기능을 모두 사용하여 액세스합니다.
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에서 지원 티켓을 만들었으며 추가 정보로 업데이트할 것입니다. ... 바라건대.
MSDN 포럼의 업데이트 정보: 여기서 속성에 대한 MS_SkipVersionCheckReading을 시도하십시오. 해당되지 않는 것 같습니다.하지만 해봤어요.여전히Not Found
내 API를 위한 것이지만 원본은 여전히 작동합니다.그래서 이것은 이 문제에 영향을 미치지 않았습니다.
네!!!
그래서 마침내 작동하게 되었고, lidydonna - msftgit에서 사용법을 복사하고 모바일 서비스를 위한 .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;
}
}
}
이 컨트롤러는 새 컨트롤러이며 기존에 사용하던 것처럼 함께 제공되는 컨트롤러가 아닙니다. 기능을 모두 처럼 보였습니다.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 사용자 지정 컨트롤러를 참조하십시오. 여기서 구성을 간단히 수정하면 문제가 해결됩니다.
프로젝트 구성에 문제가 있는 것 같습니다.여기 작업 샘플이 있습니다: https://gist.github.com/lindydonna/6fca7f689ee72ac9cd20
을 한 후HttpConfiguration
객, 출config.MapHttpAttributeRoutes()
속성 경로특을추니다습했가를 했습니다.[Route("api/Test/completeAll")]
경로가 정확하게 등록되었는지 확인할 수 있습니다.
이 특성을 Values Controller에 추가하고 경로를 확인합니다.
속성 라우팅을 사용할 때 404 오류의 또 다른 원인을 발견했습니다.
위의 코드는 원래 mobileApp.cs 에 있었습니다.
HttpConfiguration config = new HttpConfiguration();
new MobileAppConfiguration()
.UseDefaultConfiguration().MapApiControllers()
.ApplyTo(config);
config.MapHttpAttributeRoutes();
app.UseWebApi(config);
구성.MapHttpAttributeRoutes()를 위로 이동해야 합니다.적용 대상:
HttpConfiguration config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
new MobileAppConfiguration()
.UseDefaultConfiguration().MapApiControllers()
.ApplyTo(config);
상속을 ApiController에서 TableController로 전환해 보십시오.
정말 이상하지만 zure 앱 서비스에서 간단한 API 요청이 작동하지 않아 저에게 맞는 해결책을 찾았습니다.저는 c# http post/get, 안드로이드 post/get, 목표 C post/get로 http 요청을 테스트했습니다. 우선 스타트업을 업데이트해야 합니다.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!";
}
}
단순하게 첫 번째 변형을 남기고 응답을 얻을 수 있지만, 목표 C는 JSON 텍스트가 배열 또는 개체로 시작되지 않았으며 조각을 허용하는 옵션으로 시작되지 않았다고 말할 것입니다.등등..이는 객체가 아닌 단순 문자열을 얻기 때문에 발생합니다.그래서 제가 M 클래스로 제 응답을 수정한 이유입니다. 하지만 그것은 또한 당신이 어떻게 요청을 하고 어떤 종류의 객체를 기대하느냐에 달려 있습니다..MapApiControllers()는 API의 기본 키이며 WEB API 컨트롤러는 이제 zure 사용자 지정 컨트롤러로 변경되었습니다.이게 도움이 되길 바랍니다.
언급URL : https://stackoverflow.com/questions/35717996/azure-custom-controller-api-net-backend
'it-source' 카테고리의 다른 글
"빌드 앤 런" 없이 아이폰 시뮬레이터를 시작할 수 있습니까? (0) | 2023.05.26 |
---|---|
버튼 또는 레이블 텍스트에서 "&"(앰퍼샌드)를 표시하려면 어떻게 해야 합니까? (0) | 2023.05.26 |
영어로 된 예외 메시지? (0) | 2023.05.21 |
mongodb에 대한 연결을 확인하는 방법 (0) | 2023.05.21 |
브라우저가 요청을 취소하는 경우 ASP.NET Web API OperationCancelledException (0) | 2023.05.21 |