2017-09-08 28 views
1

テレメトリデータを受信するWeb APIを作成しています。ヘキサ・ストリング形式のテレメトリ・データは、Web API URLへのPOSTになります。このWeb APIには、認証もRoutePrefixもRouteも必要ありません。コンテンツタイプ:テキスト/プレーンHTTPエラー405.0のWeb API POSTデータ - メソッドが許可されていません

ここは私のコーディングです。

[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エラーは発生しません。私はこれが正しい方法だとは思わないが、実際にはさらに掘り下げる時間がない。

その他の問題は、経路を定義することです。ルートが提供されていない場合は、このコントローラをルートコンフィグレーションのデフォルトコントローラにします。

+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

関連する問題