1

これは、この質問に関連する/一種のフォローアップですが、より具体的な情報が含まれています。

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 を呼び出しているかを確認します。詳細については、ここをクリックしてください
詳細なエラー情報: モジュール IIS Web コア通知 MapRequestHandler ハンドラー StaticFile エラー コード 0x80070002 要求された URL http://ppp_peer:21609/api/inventory/sendXML/duckbill/platypus/INV_3_20090307181658000.xml 物理パス C:\project\git\CStore\HHS .API\api\inventory\sendXML\duckbill\platypus\INV_3_20090307181658000.xml Logon Method Anonymous Logon User Anonymous Request Tracing Directory C:\Users\clay\Documents\IISExpress\TraceLogFiles\HHS.API 詳細情報: このエラーは、ファイルがまたはディレクトリがサーバー上に存在しません。ファイルまたはディレクトリーを作成して、要求を再試行してください。

詳細情報を見る »

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

要約すると、「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ヘッダー何に編集すれば違いが生じるでしょうか? または何に上書きしますか?

4

1 に答える 1

0

基本的な問題は、私の PC でローカルに実行されている「サーバー」アプリにアクセスしようとしているかのようです (ハンドヘルド != PC であっても、ファッションの後で「一種の」同じことです)。

サーバー アプリがネットワーク上の別のマシンで完全に実行されているので、ヒットすることができます。ここに見られるように、まだ完全に例外的ではありませんが.

于 2014-12-24T23:36:21.960 に答える