What uri pattern do I need to communicate with my PC from my handheld device?

怎甘沉沦 提交于 2019-12-04 06:19:32

问题


As I was reminded here, I need to probably use "ppp_peer" to programmatically connect from my Compact Framework app to my Web API app running on my PC.

I have tried this (replacing an IPAddress with "ppp_peer"):

string uri = string.Format("http://ppp_peer:28642/api/FileTransfer/GetHHSetupUpdate?serialNum={0}&clientVersion={1}", serNum, clientVer);

...but I get, "NullReferenceException" in "Main" (prior to this I got "Unable to Connect to the Remote Server").

I have a breakpoint in the server code, but it doesn't reach that, so it must be somewhere in the client where this is occurring.

The client code in context is:

string uri = string.Format("http://ppp_peer:28642/api/FileTransfer/GetHHSetupUpdate?serialNum={0}&clientVersion={1}", serNum, clientVer);
RESTfulMethods.DownloadNewerVersionOfHHSetup(uri);
. . .
public static void DownloadNewerVersionOfHHSetup(string uri)
{
    string dateElements = DateTime.Now.ToString("yyyyMMddHHmmssfff", CultureInfo.InvariantCulture);
    var outputFileName = string.Format("HHSetup_{0}.exe", dateElements);
    try
    {
        var webRequest = (HttpWebRequest)WebRequest.Create(uri);
        var webResponse = (HttpWebResponse)webRequest.GetResponse();
        string statusCode = webResponse.StatusCode.ToString();
        if (statusCode == "NoContent")
        {
            MessageBox.Show("You already have the newest available version.");
        }
        else
        {
            var responseStream = webResponse.GetResponseStream();
            using (Stream file = File.Create(outputFileName))
            {
                CopyStream(responseStream, file);
                MessageBox.Show(string.Format("New version downloaded to {0}", outputFileName));
            }
        }
    }
    catch (WebException webex)
    {
        string msg = webex.Message;
        string innerEx = webex.InnerException.ToString();
        string status = webex.Status.ToString();
        MessageBox.Show(string.Format("Message: {0}; Status: {1}; inner Ex: {2}", msg, status, innerEx));
    }
}

Do I need an IPAddress in addition to ppp_peer, or is my formatting of the URI wrong, or...???

UPDATE

After the "NRE" I also see, ""...encountered a serious error and must shut down"

I changed the code from above to see just what ppp_peer is translated as:

IPAddress ipAd = Dns.Resolve("PPP_PEER").AddressList[0];
string IPAddr = ipAd.ToString();
MessageBox.Show(IPAddr);
string uri = string.Format("http://{0}:28642/api/FileTransfer/GetHHSetupUpdate?serialNum={1}&clientVersion={2}", IPAddr, serNum, clientVer);

The MessageBox call shows me "192.168.55.100" which is different from what I thought my PC's IPAddress was...???

I get the same with:

IPAddress ipAd = Dns.GetHostEntry("PPP_PEER").AddressList[0];

UPDATE 2

Using this instead (I got it from here [Get ip address of host pc from windows mobile when connected via ActiveSync):

IPAddress ipAd = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];

...the IP Address displayed is "one up" (192.168.55.101), and instead of an NRE, I get:

Message: Unable to connect to the remote server; Status: ConnectFailure; inner Ex: System.Net.Sockets.SocketException: No connection could be made because the target machine actively refused it at System.Net.Sockets.SocketConnectNoCheck(EndPoint remoteEP) ...

So it seems I'm doing all I can on the client end, and the server hears the knock, but is not opening the door - am I right?

BTW, out of curiosity I also added this code:

string hostName = Dns.GetHostName();
MessageBox.Show(string.Format("host name is {0}", hostName));

...and I see "WindowsCE"

UPDATE 3

According to this post by Andy Wiggly (the cat/bloke who wrote "MS .NET Compact Framework"), you do use "ppp_peer":

HttpWebRequest request = REST.CreateRequest(@"http://ppp_peer/DataServicesWebsite/NorthwindService.svc/Customers",
              HttpMethods.GET, String.Empty, @"application/atom+xml", "", "");

The interestingest thing about this is the lack of a port assignment (":28642" or whatever); however, this style also gives me an NRE (yes, kind of like a Null Ready to Eat).

UPDATE 4

So what uri will it take to access the host machine from the handheld device?

I have tried all of the following permutations from the client/Compact Framework app, and none work:

IPAddress ipAd = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];
string IPAddr = ipAd.ToString();

//string uri = string.Format("http://ppp_peer/api/...
//string uri = string.Format("http://ppp_peer:28642/api...
//string uri = string.Format("http://PPP_PEER/api/...
string uri = string.Format("http://PPP_PEER:28642/api/...
//string uri = string.Format("http://{0}:28642/api/...
//string uri = string.Format("http://192.168.125.50:28642/api/...
//string uri = string.Format("http://Platypus:28642/api/...
RESTfulMethods.DownloadNewerVersionOfHHSetup(uri);

The error is happening somewhere in that client code (can't step through it, so I don't know exactly where), because I have a breakpoint on the last line shown, and it is never reached.

SERVER (Web API) code:

[Route("api/FileTransfer/GetUpdatedHHSetup")]
public HttpResponseMessage GetUpdate(string serialNum, string clientVersion)
{
    return _fileTransfer.GetHHSetupUpdate(serialNum, clientVersion);
}

public HttpResponseMessage GetHHSetupUpdate(string serialNum, string clientVersion)
{
    HttpResponseMessage result;
    string filePath = GetAvailableUpdateForCustomer(serialNum); // <= breakpoint on this  
        line

I put some debug lines in DownloadNewerVersionOfHHSetup() so that it now looks like this:

public static void DownloadNewerVersionOfHHSetup(string uri)
{
    MessageBox.Show("Made it into DownloadNewerVersionOfHHSetup");
    string dateElements = DateTime.Now.ToString("yyyyMMddHHmmssfff", 
CultureInfo.InvariantCulture);
    var outputFileName = string.Format("HHSetup_{0}.exe", dateElements);
    try
    {
        var webRequest = (HttpWebRequest)WebRequest.Create(uri);
        MessageBox.Show("Made it into DownloadNewerVersionOfHHSetup #2");
        var webResponse = (HttpWebResponse)webRequest.GetResponse();
        MessageBox.Show("Made it into DownloadNewerVersionOfHHSetup #3");
        . . .

I never see "#3", so it must be a problem inside the call to GetResponse(), but how can I find out exactly what? I get the NRE, then "...encountered a serious error and must shut down"

This is where it tries to call the server but, as mentioned, it never makes it to the server method being called...

UPDATE 5

It turns out that this now works:

http://192.168.125.50:28642/api/

...and the main reason that it does is because there was a mismatch between my routing attribute (GetUpdatedHHSetup) and what I was calling from the client (GetHHSetupUpdate). Once I aligned those planets, the NRE went away, and I got the expected result.


回答1:


PPP_PEER is not needed in the uri/connection string. Using the host PC's IP Address (and port number for the server/Web API app) works now (after fixing the mismatch between the routing attribute and what the client was calling it).

I reckon using the machine name would work just as well, too.



来源:https://stackoverflow.com/questions/22331090/what-uri-pattern-do-i-need-to-communicate-with-my-pc-from-my-handheld-device

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!