2017-09-08 1 views
1

원격 데이터를 수신하기위한 웹 API를 작성 중입니다. 16 진수 문자열 형식의 원격 측정 데이터는 웹 API URL에 대한 POST 여야합니다. 이 웹 API에는 인증, RoutePrefix 및 라우트가 필요하지 않습니다. 내용 유형 : 텍스트/일반오류가있는 웹 API POST 데이터 HTTP 오류 405.0 - 허용되지 않는 메소드

다음은 나의 코드입니다.

[Route("")] 
[EnableCors(origins: "*", headers: "*", methods: "*")] 
public class MyData_Controller : ApiController 
{ 
    [HttpPost] 
    [ActionName("DefaultAction")] 
    public Task<IHttpActionResult> DataPost(String myData) 
    { 
     SaveData(myData); 
     return Task.FromResult<IHttpActionResult>(Json(true)); 
    } 

    protected void SaveData(String myData) 
    { 
    } 
} 

이 WebAPI를 IIS8.5에 호스팅했습니다. Web.config의에서, 나는 또한 그것이 우체부에서 POST를 사용하여 테스트하는 경우가

<system.webServer> 
    <handlers accessPolicy="Read, Execute, Script"> 
     <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
     <remove name="OPTIONSVerbHandler" /> 
     <remove name="TRACEVerbHandler" /> 
     <remove name="WebDAV" /> 
     <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." 
     verb="GET,HEAD,POST,PUT" 
     type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Execute" preCondition="integratedMode,runtimeVersionv4.0" /> 
    </handlers> 
    <modules runAllManagedModulesForAllRequests="true"> 
     <remove name="WebDAVModule" /> 
    </modules> 
    </system.webServer> 

, 나는 다음과 같은 오류

HTTP Error 405.0 - Method Not Allowed 
The page you are looking for cannot be displayed because an invalid method (HTTP verb) is being used. 

Detailed Error Information: 
Module  DirectoryListingModule 
Notification  ExecuteRequestHandler 
Handler StaticFile 
Error Code  0x80070001 
Requested URL  http://MyDataServer.com:2331/ 
Physical Path  E:\Applications\Web API\MyDataServer_WebAPI 
Logon Method  Anonymous 
Logon User  Anonymous 

이죠 헤더

Allow → GET, HEAD, OPTIONS, TRACE 

합니까를 보여줍니다 얻을 다음 추가 동사 POST 또는 PUT을 사용할 수 없다는 의미입니까?

StaticFile 처리기를 확인했으며 처리기 매핑 및 요청 된 제한 -> 동사가 모든 동사를 선택하도록 구성되었습니다.

구현 및 사이트 구성에 어떤 문제가 있습니까?

답변

0

나는 완벽한 방법이 아닐 수도있는 문제를 고쳤습니다. 누군가가 어쩌면 더 많거나 적은 이익을 얻었을 때를 대비하여 여기에 내 해결책을 넣어주십시오.

처리기를 통해 인증 클래스에 넣고 항상 가짜 인증 성공을 제공하는 true를 반환하면 API가 제대로 작동하지 않고 405 오류가 발생합니다. 나는 이것이 올바른 방법이라고 생각하지 않지만 실제로 더 깊이 파고 들일 시간이 없다.

다른 문제는 경로를 정의하는 것입니다. route가 제공되지 않으면이 컨트롤러를 route config 부분의 Default 컨트롤러로 만듭니다.

+0

당신이 사용할 수있는'[AllowAnonymous]'컨트롤러 또는 조치에 가짜 인증에 필요 해결하기 위해. – Nkosi

0

컨트롤러 또는 동작에서 [AllowAnonymous]을 사용하여 인증을 위장하지 않아도됩니다.

속성 라우팅을 사용함에 따라 [Route]을 루트로 설정하면 API의 URI를 디자인 할 때 더 많은 제어와 유연성을 제공 할 수 있습니다.

웹 API이므로 HTTP 상태 코드를 사용하여 요청에서 다시 피드를 제공 할 수 있습니다.

원격 측정 데이터가 요청 본문을 통해서만 전송되는 경우 [FromBody] 매개 변수 바인딩 속성을 사용하여 원격 데이터를 제한해야합니다.

[Route("/", Name = "DefaultTelemetry")] 
[EnableCors(origins: "*", headers: "*", methods: "*")] 
public class MyData_Controller : ApiController { 
    [HttpPost] 
    [AllowAnonymous] 
    [ActionName("DefaultAction")] 
    [Route("")] //Matches POST/<-- site root 
    public async Task<IHttpActionResult> Post([FromBody]String data) { 
     var saved = await SaveData(data); 
     return saved ? Ok() : BadRequest(); 
    } 

    protected Task<bool> SaveData(String data) { 
     //...implementation 
    } 
} 

참조 Attribute Routing in ASP.NET Web API 2