为什么发现“没有匹配请求URI的HTTP资源”这里? [英] Why is it that "No HTTP resource was found that matches the request URI" here?

查看:14649
本文介绍了为什么发现“没有匹配请求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

...但获取:

  {
消息:没有找到匹配请求URI的HTTP资源
'http:// localhost:21609 / api / deliveryitems / InsertIntoPPTData?stringifiedRecord = serNum77; tx2; siteNum2; bla2.xml; ppt_user2; tx_memo2; file_beg2; file_end2'。
MessageDetail:找不到与名为deliveryitems的控制器匹配的类型。
}

以同样的方式创建和调用的其他REST方法 - 为什么不是这个?它唯一与其他人没有共同点是它是一个HttpPost,而其他的是HttpGet。这是否有很大的区别?在尝试调用此REST方法时,我会从Postman的下拉菜单中选择发布。



UPDATE



是的,它显然与它是一个Post和传递参数在URI无关,因为我现在使用HttpGet方法得到相同的东西:

  {
消息:找不到与请求URI匹配的HTTP资源
'http:// localhost:21609 / api / department / getndeptsfromid?firstId = 2& countToFetch = 12'。
MessageDetail:在与该请求匹配的控制器上找不到任何操作。
}

我从邮递员这样调用:

  http:// localhost:21609 / api / department / getndeptsfromid?firstId = 2& countToFetch = 12 



...并且确实出现在我的控制器中:

  [HttpGet] 
[Route(api / department / getndeptsfromid / {firstId} / {countToFetch})]
public List< GetNDepartmentsFromID(int FirstId,int CountToFetch)
{
return CCRService.GetNDepartmentsFromID(FirstId,CountToFetch);
}



UPDATE 2



我想我会改变这个代码时解决它:

  String.Format(api / department / getndeptsfromid / {0} / {1},FirstId,CountToFetch)

p>

  String.Format(api / department / getndeptsfromid?firstId = {0}& countToFetch = {1},FirstId,CountToFetch )

...但我仍然得到相同的错误msg ...



UPDATE 3



我发现这也不起作用:

  http:// localhost:21609 / api / delivery / invnumbyid?ID = 33 

...因此有一个确定的模式。每个REST API调用我使包含args / params失败以同样的方式;所有其他( http:// localhost:21609 / api / deliveries / Count,http:// localhost:21609 / api / deliveryitems / count,http:// localhost:21609 / api / department / getall )工作就好了。 IOW,如果URI中没有args,则发现该方法。



显然有一个问题,我如何传递args / vals在URI中(在单个arg的情况下附加?= ,在两个参数?=& = 的情况下附加如何设置路由。具体来说,此风格有效:

  [Route(api / Deliveries / Count)] 

...而此样式不适用:

  [Route(api / delivery / invnumbyid / {ID})] 



将会弥补这个问题ASAP - 50点,这个Gordiesque结的解开,100如果它今天回答(在设置赏金之前)。



UPDATE 4



我更改了路由以包含arg的数据类型,因此:

  [Route(api / delivery / invnumbyid / {ID})] 

-became this:

  [Route(api / delivery / invnumbyid / {ID:int})]

但它仍然失败,咆哮:

  {
消息:找不到与请求URI匹配的HTTP资源
'http:// localhost:21609 / api / delivery / invnumbyid?ID = 45'。
MessageDetail:在与此请求匹配的控制器上找不到任何操作。
}

然后,在一个漂亮的,我试着输入到邮递员:

  http: localhost:21609 / api / delivery / invnumbyid / 45 

... (我一直认为它需要 http:// localhost:21609 / api / delivery / invnumbyid?ID = 45



但是在Postman中也有类似的尝试:

  http:// localhost:21609 / api / getndeptsfromid / 2/12 / 

...继续失败,必需参数。即使这是命中:

  [HttpGet] 
[Route(api / department / getndeptsfromid / {firstId} / {countToFetch})]
public List< Department> GetNDepartmentsFromID(int FirstId,int CountToFetch)
{
return HHSService.GetNDepartmentsFromID(FirstId,CountToFetch);
}

...并且GetNDepartmentsFromID和12)



更糟糕的是/ weirder是我得到的结果 http:// localhost:21609 / api / deliveryitems / InsertIntoPPTData / serNum77 ; tx2; siteNum2; bla2.xml; ppt_user2; tx_memo2; file_beg2; file_end2 now:

  <!DOCTYPE html PUBLIC -  // W3C // DTD XHTML 1.0 Strict // ENhttp://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\"> 
< html
xmlns =http://www.w3.org/1999/xhtml>
< head>
< title> IIS 8.0详细错误 - 404.0 - 找不到< / 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% 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; #FFF; font-size:.8em;}
- >
< / style>
< / head>
< body>
< div id =content>
< div class =content-container>
< h3> HTTP错误404.0 - 找不到< / h3>
< h4>您要查找的资源已被移除,名称已更改或暂时无法使用。< / h4>
< / div>
< div class =content-container>
< fieldset>
< h4>最可能的原因:< / h4>
< ul>
< li>指定的目录或文件不存在于Web服务器上。< / li>
< li>网址包含打印错误。< / li>
< li>自定义过滤器或模块(如URLScan)限制对文件的访问。< / li>
< / ul>
< / fieldset>
< / div>
< div class =content-container>
< fieldset>
< h4>您可以尝试的操作:< / h4>
< ul>
< li>在Web服务器上创建内容。< / li>
< li>查看浏览器网址。< / li>
< li>检查失败的请求跟踪日志,并查看哪个模块正在调用SetStatus。有关详情,请点击
< a href =http://go.microsoft.com/fwlink/?LinkID=66439>此处< / a> ;.
< / li>
< / ul>
< / fieldset>
< / div>
< div class =content-container>
< fieldset>
< h4>详细错误信息:< / h4>
< div id =details-left>
< table border =0cellpadding =0cellspacing =0>
< tr class =alt>
< th>模块< / th>
< td>& nbsp;& nbsp;& nbsp; IIS Web Core< / td>
< / tr>
< tr>
< th>通知< / th>
< td>& nbsp;& nbsp;& nbsp; MapRequestHandler< / td>
< / tr>
< tr class =alt>
< th> Handler< / th>
< td>& nbsp;& nbsp;& nbsp; StaticFile< / td>
< / tr>
< tr>
< th>错误代码< / th>
< td>& nbsp;& nbsp;& nbsp; 0x80070002< / td>
< / tr>
< / table>
< / div>
< div id =details-right>
< table border =0cellpadding =0cellspacing =0>
< tr class =alt>
< th>请求的网址< / th>
< td>& nbsp;& nbsp;& nbsp; http:// localhost:21609 / api / deliveryitems / InsertIntoPPTData / serNum77; tx2; siteNum2; bla2.xml; ppt_user2; tx_memo2; file_beg2; file_end2< / td>
< / tr>
< tr>
< th>物理路径< / th>
< td>& nbsp;& nbsp;& nbsp; 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>登录方法< / th>
< td>& nbsp;& nbsp;& nbsp;匿名< / td>
< / tr>
< tr>
< th>登录用户< / th>
< td>& nbsp;& nbsp;& nbsp;匿名< / td>
< / tr>
< tr class =alt>
< th>请求跟踪目录< / th>
< td>& nbsp;& nbsp;& nbsp; C:\Users\clay\Documents\IISExpress\TraceLogFiles\HHS.API< / td>
< / tr>
< / table>
< div class =clear>< / div>
< / div>
< / fieldset>
< / div>
< div class =content-container>
< fieldset>
< h4>详细信息:< / h4>
此错误表示文件或目录不存在于服务器上。创建文件或目录,然后再次尝试请求。

< p>
< a href =http://go.microsoft.com/fwlink/?LinkID=62293&amp;IIS70Error=404,0,0x80070002,7601>查看更多信息& raquo;< / a>
< / p>
< / fontset>
< / div>
< / div>
< / body>
< / html>



微笑地记住,总是有一个更多的石像鬼躲在沙沙背后(罗宾逊·杰弗斯和埃德加·艾伦·波似乎摔跤)。 Palely loitering ...



UPDATE 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没有给一个或多个必需的参数的值



Que demonios!



如果我使用看起来更正确的URI:

  http:// localhost:21609 / api / department / getndeptsfromid?firstId = 2& countToFetch = 12 


b $ b

我获得:

  {
消息:找不到与请求匹配的HTTP资源URI
'http:// localhost:21609 / api / department / getndeptsfromid?firstId = 2& countToFetch = 12'。
MessageDetail:在与该请求匹配的控制器上找不到任何操作。
}

但这是我提供的路线:

  [Route(api / department / getndeptsfromid / {firstId} / {countToFetch})] 

...所以我会说,我做了,其实,提供了一个匹配的操作controller.And,BTW,如果我只是输入作为到Postman的URI:

  http:// localhost:21609 / api / department / getndeptsfromid 

...然后使用Postman的URL参数键/值界面添加这些,它生成完全相同的URL,如下所示:





...完全相同的结果。



我只能说 h2_lin>解决方案

您的问题与POST / GET无关,但只与如何在RouteAttribute中指定参数有关。为了确保这一点,我在样本中添加了对这两个动词的支持。



让我们回到两个非常简单的工作示例。


$ b b

  [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是路径段参数




  • localhost:

    xxx / api / deliveryItems / dkjd; dslkf; dfk; kkklm; oeop

    • returndkjd; dslkf; dfk; kkklm; oeop




第二个示例说明anyString是一个查询字符串参数,



第二个示例示例网址是:




  • localhost:xxx / api / deliveryItems?anyString = dkjd; dslkf; dfk; kkklm; oeop

    • returndkjd; dslkf; dfk ; kkklm; oeop


  • localhost:xxx / api / deliveryItems

    • default




当然,第三个示例:

  [Route(api / deliveryitems)] 
[HttpGet,HttpPost]
public HttpResponseMessage GetDeliveryItemsThree(string anyString,string anotherString =anotherDefault)
{
return Request.CreateResponse< string>(HttpStatusCode.OK,anyString +||+ anotherString);
}

第三个示例示例网址是:




  • localhost:xxx / api / deliveryItems?anyString = dkjd; dslkf; dfk; kkklm; oeop

    • returndkjd; dslkf ; dfk; kkklm; oeop || anotherDefault


  • localhost:xxx / api / deliveryItems
      $ b b
    • 返回找不到与请求URI匹配的HTTP资源...(参数anyString是必需的)


  • < :xxx / api / deliveryItems?anotherString = bluberb& anyString = dkjd; dslkf; dfk; kkklm; oeop

    • 返回dkjd; dslkf; dfk; kkklm; oeop || bluberb



  • 请注意,参数已颠倒,无所谓, li>


    何时使用路径段或查询参数?此处已经提供了一些建议:
    REST API最佳做法:在哪里放置参数?


    I have code in my controller like so:

    [Route("api/deliveryitems/InsertIntoPPTData/{stringifiedRecord}")]
    

    ...and I'm calling it via Postman like so:

        http://localhost:21609/api/deliveryitems/InsertIntoPPTData?
    stringifiedRecord=serNum77;tx2;siteNum2;bla2.xml;ppt_user2;tx_memo2;file_beg2;file_end2
    

    ...but get:

    {
    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'."
    }
    

    Other REST methods that are created and called in the same way are found just fine - why not this one? The only thing it does not have in common with the others is that it is a HttpPost, whereas the others are HttpGet. Does that make that much of a difference? I am selecting "Post" from the dropdown in Postman when trying to call this REST method.

    UPDATE

    Yes, it apparently has nothing to do with it being a Post and passing args in the URI, because I'm getting the same thing now with an HttpGet method:

    {
    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."
    }
    

    I'm calling it from postman like so:

    http://localhost:21609/api/department/getndeptsfromid?firstId=2&countToFetch=12
    

    ...and it does indeed appear in my controller:

    [HttpGet]
    [Route("api/department/getndeptsfromid/{firstId}/{countToFetch}")]
    public List<Department> GetNDepartmentsFromID(int FirstId, int CountToFetch)
    {
        return CCRService.GetNDepartmentsFromID(FirstId, CountToFetch);
    }
    

    UPDATE 2

    I thought I was about to solve it when I changed this code:

    String.Format("api/department/getndeptsfromid/{0}/{1}", FirstId, CountToFetch)
    

    ...to this:

    String.Format("api/department/getndeptsfromid?firstId={0}&countToFetch={1}", FirstId, CountToFetch)
    

    ...but I still get the same err msg...

    UPDATE 3

    I find that this also is not working:

    http://localhost:21609/api/delivery/invnumbyid?ID=33
    

    ...and so there is a definite pattern. EVERY REST API call I make that contains args/params fails in this same way; all of the others (http://localhost:21609/api/deliveries/Count, http://localhost:21609/api/deliveryitems/count, http://localhost:21609/api/department/getall) work just fine. IOW, if there are no args in the URI, the method is discovered. If there are args, it is not.

    So apparently there's either something wrong with how I'm passing the args/vals in the URI (appending "?=" in the case of a single arg and, in the case of two args "?=&=") and/or there's something wrong with how I set up the routing. Specifically, this style works:

    [Route("api/Deliveries/Count")]
    

    ...whereas this style does not:

    [Route("api/delivery/invnumbyid/{ID}")]
    

    I will bountify this question ASAP - 50 points to the untangler of this Gordiesque knot, and 100 if it's answered today (prior to the setting up of the bounty).

    UPDATE 4

    I changed the routing to include the data type of the arg so that this:

    [Route("api/delivery/invnumbyid/{ID}")]
    

    -became this:

    [Route("api/delivery/invnumbyid/{ID:int}")]"
    

    But it still failed, growling:

    {
    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."
    }
    

    Then, "on a lark," I tried entering this into Postman:

    http://localhost:21609/api/delivery/invnumbyid/45
    

    ...and it worked! (I had been thinking it needed to be "http://localhost:21609/api/delivery/invnumbyid?ID=45")

    But a similar attempt in Postman:

    http://localhost:21609/api/department/getndeptsfromid/2/12/
    

    ...continues to fail with "No value given for one or more required parameters." even though this is hit:

    [HttpGet]
    [Route("api/department/getndeptsfromid/{firstId}/{countToFetch}")]
    public List<Department> GetNDepartmentsFromID(int FirstId, int CountToFetch)
    {
        return HHSService.GetNDepartmentsFromID(FirstId, CountToFetch);
    }
    

    ...and the args to GetNDepartmentsFromID() has the expected vals (2 and 12)

    Even worse/weirder is the result I get with "http://localhost:21609/api/deliveryitems/InsertIntoPPTData/serNum77;tx2;siteNum2;bla2.xml;ppt_user2;tx_memo2;file_beg2;file_end2" now:

    <!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>&nbsp;&nbsp;&nbsp;IIS Web Core</td>
                                </tr>
                                <tr>
                                    <th>Notification</th>
                                    <td>&nbsp;&nbsp;&nbsp;MapRequestHandler</td>
                                </tr>
                                <tr class="alt">
                                    <th>Handler</th>
                                    <td>&nbsp;&nbsp;&nbsp;StaticFile</td>
                                </tr>
                                <tr>
                                    <th>Error Code</th>
                                    <td>&nbsp;&nbsp;&nbsp;0x80070002</td>
                                </tr>
                            </table>
                        </div>
                        <div id="details-right">
                            <table border="0" cellpadding="0" cellspacing="0">
                                <tr class="alt">
                                    <th>Requested URL</th>
                                    <td>&nbsp;&nbsp;&nbsp;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>&nbsp;&nbsp;&nbsp;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>&nbsp;&nbsp;&nbsp;Anonymous</td>
                                </tr>
                                <tr>
                                    <th>Logon User</th>
                                    <td>&nbsp;&nbsp;&nbsp;Anonymous</td>
                                </tr>
                                <tr class="alt">
                                    <th>Request Tracing Directory</th>
                                    <td>&nbsp;&nbsp;&nbsp;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&amp;IIS70Error=404,0,0x80070002,7601">View more information &raquo;</a>
                        </p>
                    </fieldset>
                </div>
            </div>
        </body>
    </html> 
    

    ¡Que demonios!

    I sadly smilingly remember that there is always one more gargoyle hiding behind the rustling curtain (where Robinson Jeffers and Edgar Allen Poe are seemingly wrestling). Palely loitering...

    UPDATE 5

    Okay, here it is stated differently:

    From Postman, if I use this URL:

    http://localhost:21609/api/department/getndeptsfromid/2/12/
    

    I make it into this method:

    [HttpGet]
    [Route("api/department/getndeptsfromid/{firstId}/{countToFetch}")]
    public List<Department> GetNDepartmentsFromID(int FirstId, int CountToFetch)
    {
        return HHSService.GetNDepartmentsFromID(FirstId, CountToFetch);
    }
    

    ...where the value of FirstId is 2, and the value of CountToFetch is 12 (as I would expect them to be). But then, Postman sends back my package with the notation, "500 No value given for one or more required parameters."

    ¡Que demonios! Both parameters were obviously passed!

    If I use a URI that would seem more correct:

    http://localhost:21609/api/department/getndeptsfromid?firstId=2&countToFetch=12
    

    I get:

    {
    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."
    }
    

    Yet this is the route that I've provided:

    [Route("api/department/getndeptsfromid/{firstId}/{countToFetch}")]
    

    ...and so I would say that I did, in fact, provide a matching action on the controller.And, BTW, if I just enter this as the URI into Postman:

    http://localhost:21609/api/department/getndeptsfromid
    

    ...and then use Postman's "URL Parameter Key / Value" interface to add those, it generates the exact same URL as above, as can be seen here:

    ...and with the exact same result.

    I can only say it again (pardon my "Las Uvas de la Ira"-inspired Spanish): ¡Que demonios!

    解决方案

    Your problems have nothing to do with POST/GET but only with how to specify parameters in RouteAttribute. To ensure this, I added support for both verbs in my samples.

    Let's go back to two very simple working examples.

        [Route("api/deliveryitems/{anyString}")]
        [HttpGet, HttpPost]
        public HttpResponseMessage GetDeliveryItemsOne(string anyString)
        {
            return Request.CreateResponse<string>(HttpStatusCode.OK, anyString);
        }
    

    And

        [Route("api/deliveryitems")]
        [HttpGet, HttpPost]
        public HttpResponseMessage GetDeliveryItemsTwo(string anyString = "default")
        {
            return Request.CreateResponse<string>(HttpStatusCode.OK, anyString);
        }
    

    The first sample says that the "anyString" is a path segment parameter (part of the URL).

    First sample example URL is:

    • localhost:xxx/api/deliveryItems/dkjd;dslkf;dfk;kkklm;oeop
      • return "dkjd;dslkf;dfk;kkklm;oeop"

    The second sample says that the "anyString" is a query string parameter (optional here since a default value has been provided, but you can make it non-optional by simply removing the default value).

    Second sample examples URL are:

    • localhost:xxx/api/deliveryItems?anyString=dkjd;dslkf;dfk;kkklm;oeop
      • return "dkjd;dslkf;dfk;kkklm;oeop"
    • localhost:xxx/api/deliveryItems
      • returns "default"

    Of course, you can make it even more complex like with this third sample :

        [Route("api/deliveryitems")]
        [HttpGet, HttpPost]
        public HttpResponseMessage GetDeliveryItemsThree(string anyString, string anotherString = "anotherDefault")
        {
            return Request.CreateResponse<string>(HttpStatusCode.OK, anyString + "||" + anotherString);
        }
    

    Third sample examples URL are:

    • localhost:xxx/api/deliveryItems?anyString=dkjd;dslkf;dfk;kkklm;oeop
      • return "dkjd;dslkf;dfk;kkklm;oeop||anotherDefault"
    • localhost:xxx/api/deliveryItems
      • returns "No HTTP resource was found that matches the request URI ..." (parameter anyString is mandatory)
    • localhost:xxx/api/deliveryItems?anotherString=bluberb&anyString=dkjd;dslkf;dfk;kkklm;oeop
      • returns "dkjd;dslkf;dfk;kkklm;oeop||bluberb"
      • note that parameters have been reversed, does not matter, this is not possible with "URL-style" of first example

    When should you use path segment or query parameters ? Some advices have already been given here : REST API Best practices: Where to put parameters?

    这篇关于为什么发现“没有匹配请求URI的HTTP资源”这里?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

  • 查看全文
    相关文章
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆