Какой шаблон URI мне нужен для связи с моим ПК с моего портативного устройства?

Как мне здесь напомнили, мне, вероятно, нужно использовать "ppp_peer" для программного подключения моего приложения Compact Framework к моему приложению Web API, работающему на моем ПК.

Я пробовал это (заменив IP-адрес на "ppp_peer"):

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

... но я получаю " NullReferenceException " в "Main" (до этого я получал "Unable to Connect to Remote Server").

У меня есть точка останова в коде сервера, но она не достигает этого, поэтому она должна быть где-то в клиенте, где это происходит.

Код клиента в контексте:

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));
    }
}

Нужен ли мне IP-адрес в дополнение к ppp_peer, или мое форматирование URI неправильное, или...???

ОБНОВИТЬ

После "NRE" я также вижу: "... возникла серьезная ошибка и она должна быть закрыта"

Я изменил код сверху, чтобы увидеть, что ppp_peer переводится как:

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);

Вызов MessageBox показывает мне "192.168.55.100", что отличается от того, что я считал IP-адресом моего ПК...???

Я получаю то же самое с:

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

ОБНОВЛЕНИЕ 2

Используя это вместо этого (я получил его отсюда [ Получить IP-адрес хост-компьютера из Windows Mobile при подключении через ActiveSync):

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

... отображается IP-адрес "one up" (192.168.55.101), и вместо NRE я получаю:

Сообщение: невозможно подключиться к удаленному серверу; Статус: ConnectFailure; внутренний Пример: System.Net.Sockets.SocketException: не может быть установлено соединение, потому что целевая машина активно отказала ему в System.Net.Sockets.SocketConnectNoCheck(EndPoint remoteEP) ...

Кажется, я делаю все, что могу, на стороне клиента, и сервер слышит стук, но не открывает дверь - я прав?

Кстати, из любопытства я также добавил этот код:

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

... и я вижу " WindowsCE "

ОБНОВЛЕНИЕ 3

Согласно этому сообщению Энди Виггли (кот / парень, который написал "MS .NET Compact Framework"), вы используете "ppp_peer":

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

Самое интересное в этом - отсутствие назначения порта (":28642" или что-то еще); однако, этот стиль также дает мне NRE (да, вроде как Null Ready to Eat).

ОБНОВЛЕНИЕ 4

Итак, что потребуется для доступа к хост-машине с портативного устройства?

Я пробовал все следующие перестановки из приложения клиента /Compact Framework, и ни одна из них не работает:

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);

Ошибка происходит где-то в этом клиентском коде (не может пройти через него, поэтому я точно не знаю, где), потому что у меня есть точка останова на последней показанной строке, и она никогда не достигается.

Код SERVER (веб-API):

[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

Я поместил несколько строк отладки в DownloadNewerVersionOfHHSetup(), чтобы он теперь выглядел так:

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");
        . . .

Я никогда не вижу "#3", поэтому это должно быть проблемой внутри вызова GetResponse(), но как я могу узнать, что именно? Я получаю NRE, затем " ... столкнулся с серьезной ошибкой и должен завершить работу "

Здесь он пытается вызвать сервер, но, как уже упоминалось, он никогда не обращается к вызываемому методу сервера...

ОБНОВЛЕНИЕ 5

Оказывается, теперь это работает:

http://192.168.125.50:28642/api/

... и главная причина этого заключается в том, что между моим атрибутом маршрутизации (GetUpdatedHHSetup) и тем, что я вызывал от клиента (GetHHSetupUpdate), было несоответствие. Как только я выровнял эти планеты, NRE ушло, и я получил ожидаемый результат.

1 ответ

Решение

PPP_PEER не требуется в строке uri/connection. Использование IP-адреса хост-компьютера (и номера порта для приложения сервера / веб-API) теперь работает (после устранения несоответствия между атрибутом маршрутизации и тем, что его вызывал клиент).

Я считаю, что использование имени машины также будет работать.

Другие вопросы по тегам