it-swarm.com.de

Warum ist hier "keine HTTP-Ressource gefunden worden, die der Anforderungs-URI entspricht"?

Ich habe Code in meinem Controller so:

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

... und ich nenne es per Postman so:

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

... aber bekomme:

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

Andere REST -Methoden, die auf dieselbe Weise erstellt und aufgerufen werden, sind in Ordnung - warum nicht diese? Das einzige, was es nicht mit den anderen gemeinsam hat, ist, dass es sich um einen HttpPost handelt, während die anderen HttpGet sind. Macht das so einen Unterschied? I am wähle "Post" aus der Dropdown-Liste in Postman aus, wenn versucht wird, diese Methode REST aufzurufen.

AKTUALISIEREN

Ja, es hat anscheinend nichts damit zu tun, dass es ein Post ist und Argumente in der URI übergeben, weil ich jetzt mit einer HttpGet-Methode dasselbe bekomme:

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

Ich nenne es vom Postboten so:

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

... und es erscheint tatsächlich in meinem Controller:

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

UPDATE 2

Ich dachte, ich wäre im Begriff, das Problem zu lösen, als ich diesen Code geändert habe:

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

... dazu:

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

... aber ich bekomme immer noch die gleiche err msg ...

UPDATE 3

Ich finde, dass das auch nicht funktioniert:

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

... und so gibt es ein bestimmtes Muster. JEDER REST API-Aufruf, der von args/params ausgeführt wird, schlägt auf dieselbe Weise fehl. Alle anderen (http://localhost:21609/api/deliveries/Count, http://localhost:21609/api/deliveryitems/count, http://localhost:21609/api/department/getall) funktionieren einwandfrei. Wenn der URI keine Argumente enthält, wird die Methode ermittelt. Wenn es are args gibt, ist es nicht.

Anscheinend stimmt also entweder etwas nicht damit überein, wie ich die args/vals in der URI weitergebe (bei "? = " im Fall eines einzelnen Arguments und bei zwei Args "? = & = ") und/oder es stimmt etwas nicht mit der Einrichtung des Routings. Im Einzelnen funktioniert dieser Stil:

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

... während dieser Stil nicht

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

Ich werde diese Frage so schnell wie möglich umsetzen - 50 Punkte für den Unentwirrer dieses Gordiesque-Knotens, und 100, wenn er heute beantwortet wird (vor der Einrichtung der Kopfprämie).

UPDATE 4

Ich habe das Routing so geändert, dass es den Datentyp des Argons enthält, so dass dies:

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

-wurde dies:

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

Aber es scheiterte immer noch und knurrte:

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

Dann, auf eine Lerche, habe ich versucht, dies in Postman einzugeben:

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

...und es hat funktioniert! (Ich hatte gedacht, es müsste "http://localhost:21609/api/delivery/invnumbyid?ID=45" sein.)

Aber ein ähnlicher Versuch in Postman:

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

... schlägt weiterhin fehl mit "Kein Wert für einen oder mehrere erforderliche Parameter angegeben." obwohl dies getroffen wird:

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

... und die Argumente für GetNDepartmentsFromID () haben die erwarteten Werte (2 und 12)

Noch schlimmer/komischer ist das Ergebnis, das ich jetzt mit "http://localhost:21609/api/deliveryitems/InsertIntoPPTData/serNum77;tx2;siteNum2;bla2.xml;ppt_user2;tx_memo2;file_beg2;file_end2" bekomme:

<!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!

Ich erinnere mich traurig, dass sich hinter dem raschelnden Vorhang immer noch ein weiterer Wasserspeier versteckt (wo Robinson Jeffers und Edgar Allen Poe scheinbar ringen). Blöde Faulenzer ...

UPDATE 5

Okay, hier wird es anders angegeben:

Von Postman, wenn ich diese URL verwende: 

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

Ich mache es in diese Methode:

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

... wobei der Wert von FirstId 2 und der Wert von CountToFetch 12 ist (wie ich es erwarten würde). Dann sendet Postman mein Paket mit der Notation "500 Kein Wert für einen oder mehrere erforderliche Parameter angegeben."

¡Que demonios! Beide Parameter wurden offensichtlich bestanden!

Wenn ich eine URI verwende, scheint das korrekter zu sein:

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

Ich bekomme:

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

Dies ist jedoch die Route, die ich angegeben habe:

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

... und so würde ich sagen, dass ich tatsächlich eine passende Aktion auf dem Controller bereitgestellt habe. Übrigens, wenn ich diese als URI einfach in Postman eingebe:

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

... und dann verwenden Sie die "URL Parameter Key/Value" -Schnittstelle von Postman, um diese hinzuzufügen. Die URL erzeugt genau dieselbe URL wie oben, wie hier zu sehen ist:

enter image description here

... und mit dem exakt gleichen Ergebnis.

Ich kann es nur noch einmal sagen (verzeihen Sie mein "Las Uvas de la Ira" - inspiriertes Spanisch):¡Que demonios!

35
B. Clay Shannon

Ihre Probleme haben nichts mit POST/GET zu tun, sondern nur mit der Angabe von Parametern in RouteAttribute. Um dies sicherzustellen, fügte ich in meinen Beispielen Unterstützung für beide Verben hinzu.

Gehen wir zurück zu zwei sehr einfachen Arbeitsbeispielen.

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

Und 

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

Das erste Beispiel besagt, dass "anyString" ein Pfadsegmentparameter (Teil der URL) ist.

Das erste Beispiel-URL lautet:

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

Das zweite Beispiel besagt, dass "anyString" ein Abfragezeichenfolgeparameter ist (hier optional, da ein Standardwert angegeben wurde. Sie können ihn jedoch nicht optional machen, indem Sie einfach den Standardwert entfernen).

Zweite Beispiel-URL ist:

  • localhost: xxx/api/deliveryItems? anyString = dkjd; dslkf; dfk; kkklm; oeop
    • return "dkjd; dslkf; dfk; kkklm; oeop"
  • localhost: xxx/api/deliveryItems
    • gibt "default" zurück

Natürlich können Sie es mit diesem dritten Beispiel noch komplexer gestalten:

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

Drittes Beispiel-URL ist:

  • localhost: xxx/api/deliveryItems? anyString = dkjd; dslkf; dfk; kkklm; oeop
    • return "dkjd; dslkf; dfk; kkklm; oeop || anotherDefault"
  • localhost: xxx/api/deliveryItems
    • gibt zurück "Es wurde keine HTTP-Ressource gefunden, die der Anforderungs-URI entspricht ..." (Parameter anyString ist obligatorisch)
  • localhost: xxx/api/deliveryItems? anotherString = bluberb & anyString = dkjd; dslkf; dfk; kkklm; oeop
    • gibt "dkjd; dslkf; dfk; kkklm; oeop || bluberb" zurück
    • beachten Sie, dass die Parameter umgekehrt wurden, spielt keine Rolle, dies ist bei "URL-style" des ersten Beispiels nicht möglich

Wann sollten Sie Pfadsegment- oder Abfrageparameter verwenden? Hier wurden bereits einige Ratschläge gegeben: REST API Best Practices: Wo werden Parameter eingegeben?

40
Benoit74B

Haben Sie versucht, das [FromUri]-Attribut zu verwenden, wenn Sie Parameter über die Abfragezeichenfolge senden.

Hier ist ein Beispiel:

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

Fügen Sie dieses Paket auch oben ein, using System.Web.Http;

3
Kunal Mukherjee
WebApiConfig.Register(GlobalConfiguration.Configuration); should be on top.
2
user5430808

Sie müssen die eindeutige Route zuordnen, um Ihre Parameter als Abfrageelemente anzugeben. Fügen Sie in RouteConfig.cs (oder WebApiConfig.cs) Folgendes hinzu:

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

Wenn es sich um einen GET-Service handelt, müssen Sie ihn mit einer GET-Methode und nicht mit einer POST -Methode verwenden. Ihr Problem ist ein Typenkonflikt. Ein anderes Beispiel für Typkonflikte (um den Schweregrad in die Perspektive zu bringen) versucht, einer Ganzzahlvariablen einen String zuzuweisen.

1
DarkNinja955

Bitte überprüfen Sie die Klasse, die Sie geerbt haben. Egal ob Controller oder APIController.

Aus Versehen können wir einen Controller aus dem MVC 5-Controller erstellen. Es sollte vom Web API Controller stammen.

1
Thriveni

Ich hatte dieses Problem. Wenn Sie Ihre REST -Methoden von einer anderen Assembly aufrufen, müssen Sie sicher sein, dass alle Ihre Referenzen dieselbe Version haben wie Ihre Hauptprojektreferenzen.

Grüße.

1
Carlos Rangel

Versuchen Sie diesen Kumpel, Sie können es in den Körper wie ...

    [HttpPost]
    [Route("~/API/ChangeTheNameIfNeeded")]
    public bool SampleCall([FromBody]JObject data)
    {
        var firstName = data["firstName"].ToString();
        var lastName= data["lastName"].ToString();
        var email = data["email"].ToString();
        var obj= data["toLastName"].ToObject<SomeObject>();

        return _someService.DoYourBiz(firstName, lastName, email, obj);
    }
0
Egli Becerra