これは、この質問に関連する/一種のフォローアップですが、より具体的な情報が含まれています。
PC で REST アプリを実行しています。コンパクト フレームワークを使用するハンドヘルド WindowsCE デバイスから、サーバー上のいくつかのメソッドを呼び出す必要があります。
Postman からサーバーのメソッドにアクセスできるので、問題ありません。Postman では、次を使用します。
http://localhost:21609/api/inventory/sendXML/duckbill/platypus/bloo
...これで、サーバー アプリのこの REST メソッドのブレークポイントに到達します。
[HttpPost]
[Route("api/inventory/sendxml/{userId}/{pwd}/{filename}")]
public async Task SendInventoryXML(String userId, String pwd, String fileName)
ただし、「PPP_PEER」を使用することは、ハンドヘルド デバイスから PC に接続する方法ですが (127.0.0.1 は飛行しません。これは、ハンドヘルドがそれをそれ自体であると見なし、そのアドレスに接続しようとすると、ひどい共食い行為を犯すためです) -ハンドヘルド デバイスから動作する次の TCP コードで確認できます。
string pingString = "PING|";
TcpClient client = new TcpClient("PPP_PEER", 7727);
try
{
try
{
Stream s = client.GetStream();
StreamReader sr = new StreamReader(s);
StreamWriter sw = new StreamWriter(s) { AutoFlush = true };
String response = String.Empty;
if (firstRecord)
{
sw.WriteLine(pingString);
. . .
...PPP_PEER を使用して REST メソッドを呼び出そうとすると失敗します。
これを行うために使用するコードは次のとおりです。
//HHSConsts
public static string BASE_REST_URL = "http://PPP_PEER:21609/api/";
. . .
//frmMain
private void SendInventories()
{
try
{
foreach (String tblname in listBoxWork.Items)
{
String xmlData = hhsdbutils.GetINVDataAsXMLFromTable(tblname, fileName);
String uri = String.Format("{0}inventory/sendXML/duckbill/platypus/{1}",
HHSConsts.BASE_REST_URL, fileName);
fileXferImp = HHSConsts.GetFileTransferMethodology();
fileXferImp.SendDataContentsAsXML(uri, xmlData, tblname);
. . .
// FileXferREST.cs
public void SendDataContentsAsXML(String destinationPath, String data, String fileName,
String siteNumber, bool firstRecord, bool lastRecord)
{
SendHTTPRequestNoCredentials(destinationPath, HttpMethods.POST, data, "application/xml");
}
public static HttpWebRequest SendHTTPRequestNoCredentials(string uri, HttpMethods method,
string data, string contentType)
{
WebRequest request = WebRequest.Create(uri);
try
{
request.Method = Enum.ToObject(typeof(HttpMethods), method).ToString();
request.ContentType = contentType;
((HttpWebRequest)request).Accept = contentType;
((HttpWebRequest)request).KeepAlive = false;
((HttpWebRequest)request).ProtocolVersion = HttpVersion.Version10;
if (method != HttpMethods.GET && method != HttpMethods.DELETE)
{
byte[] arrData = Encoding.UTF8.GetBytes(data);
request.ContentLength = arrData.Length;
using (Stream oS = request.GetRequestStream())
{
oS.Write(arrData, 0, arrData.Length);
}
}
else
{
request.ContentLength = 0;
}
}
catch (WebException webex)
{
HttpWebResponse hwr = (HttpWebResponse)webex.Response;
HttpStatusCode hsc = hwr.StatusCode;
String webExMsgAndStatusCode = String.Format("{0} Status code == {1}", webex.Message,
hsc.ToString());
ExceptionLoggingService.Instance.WriteLog(String.Format("From
FileXferREST.SendHTTPRequestNoCredentials: {0}", webExMsgAndStatusCode));
}
return request as HttpWebRequest;
}
例外はスローされません。それは単に機能しません。
この呼び出しを試みるとき、次のコマンド ライン引数を使用して rawcap を実行し、ネットワーク経由で送信されるパッケージをキャプチャします。
rawcap 127.0.0.1 [fileName].pcap
次に、Wireshark で .pcap ファイルを開き、「21609」を検索して、次の TCP ストリームを取得します。
...リクエスト/レスポンスの赤/青の配色を示すために上記のスクリーン ショットを追加しましたが、ポート 21609 を含む rawcap/Wireshark の会話全体を次に示します。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
POST /api//inventory/sendXML/duckbill/platypus/INV_3_20090307181658000.xml HTTP/1.0 Content-Type: application/xml Accept: application/xml Connection: Close Content-Length: 388 Host: ppp_peer:21609
112209003343742SOME DESC2.2testVendorID]6161.51.995.58HTTP/1.1 404 見つかりません charset=utf-8 Server: Microsoft-IIS/8.0 X-SourceFiles: =?UTF-8?B?QzpccHJvamVjdFxnaXRcQ1N0b3JlXEhIUy5BUElcYXBpXGludmVudG9yeVxzZW5kWE1MXGR1Y2tiaWxsXHBsYXR5cHVzXElOVl8zXzIwMDkwMzA3MTgxNjU4MDAwLnhtbA==?= X-Powered-By: ASP.NET Date: Thu, 18 Dec 2014 17:23:01 GMT 接続: 閉じる Content-Length: 5016
IIS 8.0 詳細エラー - 404.0 - 見つかりません
HTTP エラー 404.0 - 見つかりません
お探しのリソースは削除されているか、名前が変更されているか、一時的に利用できません。最も考えられる原因:- .
- 指定されたディレクトリまたはファイルは、Web サーバー上に存在しません。 .
- URL にタイプミスがあります。 .
- URLScan などのカスタム フィルタまたはモジュールは、ファイルへのアクセスを制限します。
- .
- Web サーバー上にコンテンツを作成します。 .
- ブラウザの URL を確認します。 .
- 失敗した要求のトレース ログを確認し、どのモジュールが SetStatus を呼び出しているかを確認します。詳細については、ここをクリックしてください。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
要約すると、「PPP_PEER」はハンドヘルド デバイスが PC を記述/接続する方法として機能し (TCP コードで動作します)、REST メソッドは別のプロセス (Postman など) から到達可能ですが、呼び出しを試みますハンドヘルド デバイスから PPP_PEER を使用する方法は、「404.0 - Not Found」エラーで失敗します。
なんで?
アップデート
「PPP_PEER」を PC のマシン名に置き換えると、エラーが「404 - Not Found」から「503 - Service Unavailable」に変わります。
サービスは明らかに利用可能で、Postman から呼び出すとサービスが実行され、ブレークポイントにヒットするためです。
更新 2
これは奇妙です: 「切り捨てられた」名前だけでなく完全なマシン名を使用すると、エラーは 503 ではなく 404 に戻ります。
したがって、ホスト名として PPP_PEER を使用すると、404 が返されます。shannon2 を使用すると、503 が返されます。shannon2.sscs.ad を使用すると、再び 404 が返されます。これは、Tim Berners-Lee、Al Gore、Andy Warhol、または他の誰かのせいにする必要がありますか?
SO... これらは、Eric Law の最初の提案に従おうとした私の結果です。他に2つありますが、Hostヘッダーを何に編集すれば違いが生じるでしょうか? または何に上書きしますか?