2017-05-24 3 views
0

私のテストアプリケーションはWebアプリケーションAPIを使用してVs 2013 Webアプリケーションの空のテンプレートを使用して開発されました。Web API 2 - IIS7 POSTメソッド。 405 - 私は見つけることができるすべての可能な解決策を試した後に許可されません

これは私のルーティングの初期化は、次のようになります。これは私のweb.configファイルには、すべての提案の修正を含めた後のように見えるものである

[EnableCors(origins: "*", headers: "*", methods: "*")] 
public class TestController : ApiController 
{ 
    [Route ("Test")] 
    [HttpGet] 
    public string Get() 
    { 
     return "Response to get Request"; 
    } 

    [Route("Test")] 
    [HttpPost] 
    public string Post(string text) 
    { 
     return string.Format("Received: '{0}'", text); 
    } 
} 

:これは私のコントローラのように見えるものである

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 
     config.EnableCors(); 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 
    } 
} 

<system.web> 
    <compilation debug="true" targetFramework="4.5.1" /> 
    <httpRuntime targetFramework="4.5.1" /> 
    <webServices> 
    <protocols> 
     <add name="HttpGet" /> 
     <add name="HttpPost" /> 
     <add name="HttpPut" /> 
     <add name="HttpDelete" /> 
    </protocols> 
    </webServices> 
</system.web> 
<system.webServer> 
    <handlers> 
    <remove name="WebDAV" /> 
    <remove name="OPTIONSVerbHandler" /> 
    <remove name="TRACEVerbHandler" /> 
    <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" /> 
    <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" /> 
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
    </handlers> 
    <security> 
    <requestFiltering> 
     <verbs allowUnlisted="false"> 
     <add verb="GET" allowed="true" /> 
     <add verb="POST" allowed="true" /> 
     <add verb="DELETE" allowed="true" /> 
     <add verb="PUT" allowed="true" /> 
     </verbs> 
    </requestFiltering> 
    </security> 

    <modules runAllManagedModulesForAllRequests="true"> 
    <remove name="WebDAVModule" /> 
    </modules> 
</system.webServer> 

私はハンドラマッピングとリクエストフィルタリングを確認しました。 IISマネージャーとPOST動詞を使用するアプリケーションが有効になっています。

私はISSによって拒否された要求をトレースしていると、下図のように、私はManagedPipeLineHandlerは405エラーを設定していることが見つかりました:

ModuleNameをManagedPipelineHandler

通知128

はhttpStatus 405

HttpReasonメソッドが使用できない

HttpSubStatus 0

のErrorCode 0

ConfigExceptionInfo

通知EXECUTE_REQUEST_HANDLER

正常に完了した操作をエラーコード。 (0x0)

私の前提は私のアプリケーションにはないということです。私は正しいですか?

私はFiddlerを使用してテストしていますが、レスポンスヘッダーに「セキュリティ:」という名前のセクションがあり、「取得:GET」と表示されます。

この情報はどこから得られますか?この質問に対する答えは私を解決に導くかもしれません。

私は運がないとこれを修正しようと多くの時間を費やしました。どんなフィードバックも高く評価されます。

答えて

0

私はこの時点では「許可されていません」がIISから来ていると仮定していましたが、私は間違っていたようです。

マイ・ポスト・メソッドのパラメータはstring型です。私は、私のルート属性には以下のようなパラメータが含まれていないと仮定していました。パラメータは要求本体から取得されます。

[Route("Test")] 
[HttpPost] 
public string Post(string text) 

私は[FromBody]属性をこのパラメータに追加しました。私の驚いたことに、405の代わりに415のエラーが発生しました。

415エラーの研究は、このリンクに連れて行ってくれました:

https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

をリンクに文字列パラメータは、URIの一部であると考えられることを私に伝え、身体内の文字列こと、 content-type application/textで送信された場合、デフォルトのフォーマッタはありません。

新しいコントローラーに表示されているように、jsonオブジェクトに文字列パラメーターをカプセル化しました。これでPOSTが機能します。

[EnableCors(origins: "*", headers: "*", methods: "*")] 
public class TestController : ApiController 
{ 
    [Route ("Test")] 
    [HttpGet] 
    public string Get() 
    { 
     return "Response to get Request"; 
    } 

    [Route("Test")] 
    [HttpPost] 
    public string Post(StringAsJson stringAsJason) 
    { 
     return string.Format("Received: '{0}'", stringAsJason.Value); 
    } 
} 

public class StringAsJson 
{ 
    public string Value { get; set; } 
} 

元のプログラムに戻って同じことを試みましたが、まだ405エラーが表示されます。違いは、今はIISの問題ではないことを知っていることです。

プログラムを作成できない場合は別のケースを開きます。

関連する問題