1

这与此问题相关/有点类似,但包含越来越多的具体信息。

我有一个 REST 应用程序在我的 PC 上运行。我需要从使用紧凑框架的手持 WindowsCE 设备调用服务器上的一些方法。

我可以从邮递员那里联系服务器的方法,所以这样没有问题。在邮递员中,我使用:

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 未找到缓存控制:私有内容类型:文本/html;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 连接:关闭内容长度:5016

IIS 8.0 详细错误 - 404.0 - 未找到

HTTP 错误 404.0 - 未找到

您要查找的资源已被删除、名称已更改或暂时不可用。最可能的原因:
    .
  • 指定的目录或文件在 Web 服务器上不存在。
  • .
  • URL 包含印刷错误。
  • .
  • 自定义过滤器或模块(例如 URLScan)限制对文件的访问。
你可以尝试的事情:
    .
  • 在 Web 服务器上创建内容。
  • .
  • 查看浏览器 URL。
  • .
  • 检查失败的请求跟踪日志并查看哪个模块正在调用 SetStatus。欲了解更多信息,请单击此处
详细错误信息:Module IIS Web Core Notification MapRequestHandler Handler StaticFile Error Code 0x80070002 Requested 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”错误。

为什么?

更新

当我用 PC 的机器名替换“PPP_PEER”时,错误从“404 - Not Found”变为“503 - Service Unavailable”:

在此处输入图像描述

但这有点像 rompecabeza,因为该服务显然是可用的,因为它正在运行并且当我从 Postman 调用它时它的断点被命中。

更新 2

现在这很奇怪:如果我使用完整的机器名称而不是“截断”名称,错误会回到 404 而不是 503:

在此处输入图像描述

因此,如果我使用 PPP_PEER 作为主机名,我会得到 404;如果我使用 shannon2,我会得到 503;如果我使用 shannon2.sscs.ad,我再次得到 404。我应该将此归咎于 Tim Berners-Lee、Al Gore、Andy Warhol 还是其他人?

所以...这些是我尝试遵循 Eric Law 的第一个建议的结果;还有另外两个,但是:我将如何编辑 Host 标头可能会有所不同?或将其覆盖为什么

4

1 回答 1

0

似乎基本问题是试图访问在我的 PC 上本地运行的“服务器”应用程序(即使手持设备!= PC,它也是“某种”相同的东西,在时尚之后)。

现在服务器应用程序完全在网络上的另一台机器上运行,我可以点击它;虽然还不是完全没有例外,正如可以在这里看到的那样。

于 2014-12-24T23:36:21.960 回答