[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
質問内容
コントローラ内に以下のようなコードがあります。
[Route("api/deliveryitems/InsertIntoPPTData/{stringifiedRecord}")]
...そして、このようにPostman経由で呼び出しています。
http://localhost:21609/api/deliveryitems/InsertIntoPPTData?
stringifiedRecord=serNum77;tx2;siteNum2;bla2.xml;ppt_user2;tx_memo2;file_beg2;file_end2
...しかし、得る。
{
Message: "No HTTP resource was found that matches the request URI
'http://localhost:21609/api/deliveryitems/InsertIntoPPTData? stringifiedRecord=serNum77;tx2;siteNum2;bla2.xml;ppt_user2;tx_memo2;file_beg2;file_end2'."
MessageDetail: "No type was found that matches the controller named 'deliveryitems'."
}
同じように作成され、呼び出された他のRESTメソッドは問題なく見つかりますが、なぜこのメソッドは見つからないのでしょうか?他のメソッドと共通していないのは、他のメソッドがHttpGetであるのに対し、このメソッドはHttpPostであるということのみです。これはそんなに大きな違いなのでしょうか?I アム このRESTメソッドを呼び出そうとしたとき、Postmanのドロップダウンから"Post"を選択しています。
アップデイト
そう、どうやらPostであることと、URIに引数を渡すこととは関係ないようです。
{
Message: "No HTTP resource was found that matches the request URI
'http://localhost:21609/api/department/getndeptsfromid?firstId=2&countToFetch=12'."
MessageDetail: "No action was found on the controller 'Department' that matches the request."
}
こんな感じでpostmanから呼び出しています。
http://localhost:21609/api/department/getndeptsfromid?firstId=2&countToFetch=12
...そして、それは確かに私のコントローラに表示されます。
[HttpGet]
[Route("api/department/getndeptsfromid/{firstId}/{countToFetch}")]
public List<Department> GetNDepartmentsFromID(int FirstId, int CountToFetch)
{
return CCRService.GetNDepartmentsFromID(FirstId, CountToFetch);
}
アップデイト2
このコードを変えたら解決しそうな気がした。
String.Format("api/department/getndeptsfromid/{0}/{1}", FirstId, CountToFetch)
...これを
String.Format("api/department/getndeptsfromid?firstId={0}&countToFetch={1}", FirstId, CountToFetch)
...しかし、同じエラーメッセージが表示されます...
アップデイト3
これもうまくいかないことがわかりました。
http://localhost:21609/api/delivery/invnumbyid?ID=33
...といった具合に、明確なパターンがあるのです。私が行うargs/paramsを含むREST APIコールのすべてが、これと同じ方法で失敗します。
http://localhost:21609/api/deliveries/Count, http://localhost:21609/api/deliveryitems/count, http://localhost:21609/api/department/getall
) は問題なく動作します。つまり、URIに引数がない場合、メソッドは発見されます。もし
は
を指定した場合は、指定しない。
ということは、どうやらURIのargs/valの渡し方に問題があるようだ(quotを付加する。 ?= 1つの引数の場合は "、2つの引数の場合は ".となります。 ?=&= ")、またはルーティングの設定に何か問題があるようです。具体的には、このスタイルで動作します。
[Route("api/Deliveries/Count")]
...一方、このスタイルではそうではありません。
[Route("api/delivery/invnumbyid/{ID}")]
このゴーディスクの結び目を解いた人に50ポイント、今日(懸賞金設定前)回答された人には100ポイントを進呈します。
アップデイト4
argのデータ型を含むようにルーティングを変更して、このようにしました。
[Route("api/delivery/invnumbyid/{ID}")]
-は、こうなった。
[Route("api/delivery/invnumbyid/{ID:int}")]"
しかし、やはり失敗し、唸った。
{
Message: "No HTTP resource was found that matches the request URI
'http://localhost:21609/api/delivery/invnumbyid?ID=45'."
MessageDetail: "No action was found on the controller 'Delivery' that matches the request."
}
そして、ふと思い立って、これをPostmanに入力してみた。
http://localhost:21609/api/delivery/invnumbyid/45
...そして、うまくいきました! (私は、これは " でなければならないと思っていました。
http://localhost:21609/api/delivery/invnumbyid?ID=45
ということです。)
しかし、Postmanでも同様の試みが。
http://localhost:21609/api/department/getndeptsfromid/2/12/
...ヒットしたにもかかわらず、"No value given for one or more required parameters."で失敗し続けています。
[HttpGet]
[Route("api/department/getndeptsfromid/{firstId}/{countToFetch}")]
public List<Department> GetNDepartmentsFromID(int FirstId, int CountToFetch)
{
return HHSService.GetNDepartmentsFromID(FirstId, CountToFetch);
}
...そして、GetNDepartmentsFromID()への引数は、期待通りの値(2および12)を持っています。
さらに悪いことに、" を使用した場合の結果も奇妙です。
http://localhost:21609/api/deliveryitems/InsertIntoPPTData/serNum77;tx2;siteNum2;bla2.xml;ppt_user2;tx_memo2;file_beg2;file_end2
"になりました。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html
xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>IIS 8.0 Detailed Error - 404.0 - Not Found</title>
<style type="text/css">
<!--
body{margin:0;font-size:.7em;font-family:Verdana,Arial,Helvetica,sans-serif;}
code{margin:0;color:#006600;font-size:1.1em;font-weight:bold;}
.config_source code{font-size:.8em;color:#000000;}
pre{margin:0;font-size:1.4em;word-wrap:break-word;}
ul,ol{margin:10px 0 10px 5px;}
ul.first,ol.first{margin-top:5px;}
fieldset{padding:0 15px 10px 15px;word-break:break-all;}
.summary-container fieldset{padding-bottom:5px;margin-top:4px;}
legend.no-expand-all{padding:2px 15px 4px 10px;margin:0 0 0 -12px;}
legend{color:#333333;;margin:4px 0 8px -12px;_margin-top:0px;
font-weight:bold;font-size:1em;}
a:link,a:visited{color:#007EFF;font-weight:bold;}
a:hover{text-decoration:none;}
h1{font-size:2.4em;margin:0;color:#FFF;}
h2{font-size:1.7em;margin:0;color:#CC0000;}
h3{font-size:1.4em;margin:10px 0 0 0;color:#CC0000;}
h4{font-size:1.2em;margin:10px 0 5px 0;
}#header{width:96%;margin:0 0 0 0;padding:6px 2% 6px 2%;font-family:"trebuchet MS",Verdana,sans-serif;
color:#FFF;background-color:#5C87B2;
}#content{margin:0 0 0 2%;position:relative;}
.summary-container,.content-container{background:#FFF;width:96%;margin-top:8px;padding:10px;position:relative;}
.content-container p{margin:0 0 10px 0;
}#details-left{width:35%;float:left;margin-right:2%;
}#details-right{width:63%;float:left;overflow:hidden;
}#server_version{width:96%;_height:1px;min-height:1px;margin:0 0 5px 0;padding:11px 2% 8px 2%;color:#FFFFFF;
background-color:#5A7FA5;border-bottom:1px solid #C1CFDD;border-top:1px solid #4A6C8E;font-weight:normal;
font-size:1em;color:#FFF;text-align:right;
}#server_version p{margin:5px 0;}
table{margin:4px 0 4px 0;width:100%;border:none;}
td,th{vertical-align:top;padding:3px 0;text-align:left;font-weight:normal;border:none;}
th{width:30%;text-align:right;padding-right:2%;font-weight:bold;}
thead th{background-color:#ebebeb;width:25%;
}#details-right th{width:20%;}
table tr.alt td,table tr.alt th{}
.highlight-code{color:#CC0000;font-weight:bold;font-style:italic;}
.clear{clear:both;}
.preferred{padding:0 5px 2px 5px;font-weight:normal;background:#006633;color:#FFF;font-size:.8em;}
-->
</style>
</head>
<body>
<div id="content">
<div class="content-container">
<h3>HTTP Error 404.0 - Not Found</h3>
<h4>The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.</h4>
</div>
<div class="content-container">
<fieldset>
<h4>Most likely causes:</h4>
<ul>
<li>The directory or file specified does not exist on the Web server.</li>
<li>The URL contains a typographical error.</li>
<li>A custom filter or module, such as URLScan, restricts access to the file.</li>
</ul>
</fieldset>
</div>
<div class="content-container">
<fieldset>
<h4>Things you can try:</h4>
<ul>
<li>Create the content on the Web server.</li>
<li>Review the browser URL.</li>
<li>Check the failed request tracing log and see which module is calling SetStatus. For more information, click
<a href="http://go.microsoft.com/fwlink/?LinkID=66439">here</a>.
</li>
</ul>
</fieldset>
</div>
<div class="content-container">
<fieldset>
<h4>Detailed Error Information:</h4>
<div id="details-left">
<table border="0" cellpadding="0" cellspacing="0">
<tr class="alt">
<th>Module</th>
<td> IIS Web Core</td>
</tr>
<tr>
<th>Notification</th>
<td> MapRequestHandler</td>
</tr>
<tr class="alt">
<th>Handler</th>
<td> StaticFile</td>
</tr>
<tr>
<th>Error Code</th>
<td> 0x80070002</td>
</tr>
</table>
</div>
<div id="details-right">
<table border="0" cellpadding="0" cellspacing="0">
<tr class="alt">
<th>Requested URL</th>
<td> http://localhost:21609/api/deliveryitems/InsertIntoPPTData/serNum77;tx2;siteNum2;bla2.xml;ppt_user2;tx_memo2;file_beg2;file_end2</td>
</tr>
<tr>
<th>Physical Path</th>
<td> C:\project\git\CStore\HHS.API\api\deliveryitems\InsertIntoPPTData\serNum77;tx2;siteNum2;bla2.xml;ppt_user2;tx_memo2;file_beg2;file_end2</td>
</tr>
<tr class="alt">
<th>Logon Method</th>
<td> Anonymous</td>
</tr>
<tr>
<th>Logon User</th>
<td> Anonymous</td>
</tr>
<tr class="alt">
<th>Request Tracing Directory</th>
<td> C:\Users\clay\Documents\IISExpress\TraceLogFiles\HHS.API</td>
</tr>
</table>
<div class="clear"></div>
</div>
</fieldset>
</div>
<div class="content-container">
<fieldset>
<h4>More Information:</h4>
This error means that the file or directory does not exist on the server. Create the file or directory and try the request again.
<p>
<a href="http://go.microsoft.com/fwlink/?LinkID=62293&IIS70Error=404,0,0x80070002,7601">View more information »</a>
</p>
</fieldset>
</div>
</div>
</body>
</html>
悪魔よ!
ロビンソン・ジェファースとエドガー・アレン・ポーが格闘しているように見える)ざわざわしたカーテンの向こうには、いつももう一人のガーゴイルが隠れていることを、私は悲しくも微笑ましく思い出している。淡くうろうろしている...。
アップデイト5
なるほど、ここでは違う表現をしていますね。
Postmanから、このURLを使うと。
http://localhost:21609/api/department/getndeptsfromid/2/12/
このメソッドにしています。
[HttpGet]
[Route("api/department/getndeptsfromid/{firstId}/{countToFetch}")]
public List<Department> GetNDepartmentsFromID(int FirstId, int CountToFetch)
{
return HHSService.GetNDepartmentsFromID(FirstId, CountToFetch);
}
...ここで、FirstIdの値は2であり、CountToFetchの値は12です(私が期待するとおりです)。しかし、その後、Postmanは私のパッケージを、"という表記で送り返してきました。 500 1つまたは複数の必須パラメータに値が与えられていません。 "です。
悪魔よ!明らかに両方のパラメータを通過している!
URIを使用すれば、より正しいと思われます。
http://localhost:21609/api/department/getndeptsfromid?firstId=2&countToFetch=12
得ることができる。
{
Message: "No HTTP resource was found that matches the request URI
'http://localhost:21609/api/department/getndeptsfromid?firstId=2&countToFetch=12'."
MessageDetail: "No action was found on the controller 'Department' that matches the request."
}
とはいえ、これは私が用意したルートです。
[Route("api/department/getndeptsfromid/{firstId}/{countToFetch}")]
...というわけで、実際にコントローラにマッチするアクションを提供したと言えるでしょう。ちなみに、PostmanにURIとしてこれを入力すると。
http://localhost:21609/api/department/getndeptsfromid
...そしてPostmanの "URL Parameter Key / Value" インターフェイスを使ってこれらを追加すると、ここで見られるように、上記と全く同じURLが生成されます。
...そして、まったく同じ結果になりました。
もう一度言うしかないですね(失礼しました&quot; ラス・ウバス・デ・ラ・イラ "的なスペイン語)。 悪魔よ!
解決方法は?
この問題は、POST/GET とは関係なく、単に
RouteAttribute
. これを確実にするために、私のサンプルでは両方の動詞をサポートするようにしました。
それでは、2つの非常にシンプルな動作例に戻りましょう。
[Route("api/deliveryitems/{anyString}")]
[HttpGet, HttpPost]
public HttpResponseMessage GetDeliveryItemsOne(string anyString)
{
return Request.CreateResponse<string>(HttpStatusCode.OK, anyString);
}
そして
[Route("api/deliveryitems")]
[HttpGet, HttpPost]
public HttpResponseMessage GetDeliveryItemsTwo(string anyString = "default")
{
return Request.CreateResponse<string>(HttpStatusCode.OK, anyString);
}
最初のサンプルでは、"
anyString
"は、パスセグメントパラメーター(URLの一部)です。
最初のサンプル例のURLは
-
ローカルホストを使用します。
xxx/api/deliveryItems/dkjd;dslkf;dfk;kkklm;oeop
-
リターン
"dkjd;dslkf;dfk;kkklm;oeop"
-
リターン
2つ目のサンプルでは、「"
anyString
はクエリ文字列パラメータです (デフォルト値が提供されているので、ここではオプションです。ただし、デフォルト値を削除するだけでオプションでなくすることができます)。
2つ目のサンプル例のURLは
-
ローカルホスト
xxx/api/deliveryItems?anyString=dkjd;dslkf;dfk;kkklm;oeop
-
リターン
"dkjd;dslkf;dfk;kkklm;oeop"
-
リターン
-
ローカルホストの
xxx/api/deliveryItems
-
リターン
"default"
-
リターン
もちろん、この3つ目のサンプルのように、さらに複雑にすることも可能です。
[Route("api/deliveryitems")]
[HttpGet, HttpPost]
public HttpResponseMessage GetDeliveryItemsThree(string anyString, string anotherString = "anotherDefault")
{
return Request.CreateResponse<string>(HttpStatusCode.OK, anyString + "||" + anotherString);
}
3番目のサンプル例のURLは
-
ローカルホスト
xxx/api/deliveryItems?anyString=dkjd;dslkf;dfk;kkklm;oeop
-
リターン
"dkjd;dslkf;dfk;kkklm;oeop||anotherDefault"
-
リターン
-
ローカルホストの
xxx/api/deliveryItems
-
は "リクエストURIに一致するHTTPリソースが見つかりませんでした ..."を返します(パラメータ
anyString
は必須です)
-
は "リクエストURIに一致するHTTPリソースが見つかりませんでした ..."を返します(パラメータ
-
ローカルホストの
xxx/api/deliveryItems?anotherString=bluberb&anyString=dkjd;dslkf;dfk;kkklm;oeop
-
リターン
"dkjd;dslkf;dfk;kkklm;oeop||bluberb"
- パラメータが逆になっていることに注意してください。これは重要ではありませんが、最初の例の "URL-style"では不可能です。
-
リターン
パスセグメントやクエリパラメータは、どのような場合に使用するのでしょうか?すでにいくつかのアドバイスがここでなされています。 REST APIのベストプラクティス。パラメータをどこに置くか?
関連
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み】 C# 条件演算子エラー 代入、call、increment、decrement、await、new object 式のみ文として使用可能です。
-
VSでscanfエラーを恒久的に解決するには、ソースファイルを作成し、自動的に#define _CRT_SECURE_NO_WARNINGS 1を追加してください。
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない
-
[解決済み] Home'という名前のコントローラに一致するタイプが複数見つかりました。
-
[解決済み] リクエストは中断されました。SSL/TLSセキュアチャネルを作成できませんでした
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】バックスラッシュを含むパス文字列のエスケープシーケンスが認識されない件
-
[解決済み] 'IEnumerable<SelectListItem>' 型の ViewData アイテムで、キーが国であるものは存在しない。
-
[解決済み】EF 5 Enable-Migrations : アセンブリにコンテキストタイプが見つかりませんでした
-
[解決済み】OnCollisionEnter2Dが実行されない?
-
[解決済み] 2つのリストを結合する
-
[解決済み】IntPtrとは一体何なのか?
-
[解決済み】画像のペイントにTextureBrushを使用する方法
-
[解決済み] 関数を終了するには?
-
[解決済み】データが存在しないのに読み込もうとする試みが無効である