Подтвердить что ты не робот

Почему "Нет HTTP-ресурса, который соответствует URI запроса" здесь?

У меня есть код в моем контроллере:

[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, которые создаются и вызывается таким же образом, найдены просто отлично - почему бы и нет? Единственное, что не имеет общего с другими, это то, что это HttpPost, тогда как другие HttpGet. Значит ли это, что большая разница? Я выбираю "Post" из раскрывающегося списка Postman при попытке вызвать этот метод REST.

UPDATE

Да, это, по-видимому, не имеет никакого отношения к тому, что это сообщение и передача аргументов в URI, потому что теперь я получаю то же самое с помощью метода HttpGet:

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

Я называю это от почтальона следующим образом:

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)

... но я все равно получаю то же самое err msg...

ОБНОВЛЕНИЕ 3

Я считаю, что это также не работает:

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

... и поэтому существует определенная картина. EVERY 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/vals в URI (добавляя "? =" в случае одного аргумента и, в случае двух аргументов "? = & =" ) и/или что-то не так с тем, как я настроил маршрутизацию. В частности, этот стиль работает:

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

... тогда как этого стиля нет:

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

Я постараюсь ответить на этот вопрос КАК МОЖНО СКОРЕЕ - 50 баллов для этого участника Gordiesque, и 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/

... продолжает сбой: "Нет значения для одного или нескольких требуемых параметров". хотя это и попало:

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

... и аргументы GetNDepartmentsFromID() имеют ожидаемые vals (2 и 12)

Еще хуже /weerder - результат, который я получил с помощью < 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="#" onclick="location.href='http://go.microsoft.com/fwlink/?LinkID=66439'; return false;">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="#" onclick="location.href='http://go.microsoft.com/fwlink/?LinkID=62293&amp;IIS70Error=404,0,0x80070002,7601'; return false;">View more information &raquo;</a>
                    </p>
                </fieldset>
            </div>
        </div>
    </body>
</html> 

¡Que demonios!

Я печально улыбаюсь, помню, что за шорошом занавесом (где Робинсон Джефферс и Эдгар Аллен По есть, по-видимому, борьба) есть еще одна горгулья. Нехорошо покоряясь...

ОБНОВЛЕНИЕ 5

Хорошо, здесь сказано иначе:

От почтальона, если я использую этот 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

Я получаю:

{
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}")]

... и поэтому я бы сказал, что на самом деле я сделал соответствующее действие над контроллером. И, BTW, если я просто введите это как URI в Postman:

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

... и затем используйте интерфейс Postman "URL Parameter Key/Value", чтобы добавить их, он генерирует тот же самый URL, что и выше, как можно увидеть здесь:

enter image description here

... и с тем же результатом.

Я могу только сказать это снова (простить мой "Las Uvas de la Ira" - испанский испанский): ¡Que demonios!

4b9b3361

Ответ 1

Ваши проблемы не имеют ничего общего с POST/GET, но только с тем, как указать параметры в RouteAttribute. Чтобы обеспечить это, я добавил поддержку обоих глаголов в своих образцах.

Вернемся к двум очень простым рабочим примерам.

    [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:

  • локальный: ххх/апи/deliveryItems/dkjd; dslkf; ДФК; kkklm; oeop
    • return "dkjd; dslkf; dfk; kkklm; oeop"

Во втором примере говорится, что "anyString" является параметром строки запроса (необязательно здесь, поскольку значение по умолчанию было предоставлено, но вы можете сделать его не необязательным, просто удалив значение по умолчанию).

Второй пример примеров URL:

  • локальный: ххх/апи/deliveryItems anyString = dkjd; dslkf; ДФК; kkklm; oeop
    • return "dkjd; dslkf; dfk; kkklm; oeop"
  • локальный: ххх /API/deliveryItems
    • возвращает "default"

Конечно, вы можете сделать это еще более сложным, как с этим третьим образцом:

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

Третий пример примеров URL:

  • локальный: ххх/апи/deliveryItems anyString = dkjd; dslkf; ДФК; kkklm; oeop
    • return "dkjd; dslkf; dfk; kkklm; oeop || anotherDefault"
  • локальный: ххх /API/deliveryItems
    • возвращает "Не найден ресурс HTTP, соответствующий запросу URI..." (параметр anyString является обязательным)
  • локальный: ххх/апи/deliveryItems anotherString = bluberb & anyString = dkjd; dslkf; ДФК; kkklm; oeop
    • возвращает "dkjd; dslkf; dfk; kkklm; oeop || bluberb"
    • обратите внимание, что параметры были отменены, это не имеет значения, это невозможно в "URL-стиле" первого примера

Когда вы должны использовать сегмент маршрута или параметры запроса? Некоторые советы уже приведены здесь: REST API. Лучшие практики: Где разместить параметры?

Ответ 2

Пробовали ли вы использовать атрибут [FromUri] при отправке параметров по строке запроса.

Вот пример:

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

Включите этот пакет вверху, using System.Web.Http;

Ответ 3

Если это услуга GET, вам необходимо использовать ее с методом GET, а не методом POST. Ваша проблема - несоответствие типа. Другой пример несоответствия типа (для определения серьезности в перспективе) пытается присвоить строку целочисленной переменной.

Ответ 4

WebApiConfig.Register(GlobalConfiguration.Configuration); should be on top.

Ответ 5

Вам нужно сопоставить уникальный маршрут, чтобы указать ваши параметры в качестве элементов запроса. В RouteConfig.cs(или WebApiConfig.cs) добавьте:

config.Routes.MapHttpRoute(
            name: "MyPagedQuery",
            routeTemplate:     "api/{controller}/{action}/{firstId}/{countToFetch}",
            defaults: new { action = "GetNDepartmentsFromID" }
        );