当我被提醒here时,我需要使用“ppp_peer”以编程方式从我的Compact Framework应用程序连接到我的PC上运行的Web API应用程序。
我试过这个(用“ppp_peer”替换IPAddress):
string uri = string.Format("http://ppp_peer:28642/api/FileTransfer/GetHHSetupUpdate?serialNum={0}&clientVersion={1}", serNum, clientVer);
...但是我在“Main”中得到“ NullReferenceException ”(在此之前我得到“无法连接到远程服务器”)。
我在服务器代码中有一个断点,但它没有达到,所以它必须在客户端的某个地方发生这种情况。
上下文中的客户端代码是:
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));
}
}
除了 ppp_peer之外,我还需要IPAddress ,还是我的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”,这与我认为PC的IPAddress不同...... ???
我也是这样:
IPAddress ipAd = Dns.GetHostEntry("PPP_PEER").AddressList[0];
使用它(我从这里[Get ip address of host pc from windows mobile when connected via ActiveSync获得):
IPAddress ipAd = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];
...显示的IP地址是“one up”(192.168.55.101),而不是NRE,我得到:
消息:无法连接到远程服务器;状态:ConnectFailure;内部Ex:System.Net.Sockets.SocketException:无法建立连接,因为目标计算机在System.Net.Sockets.SocketConnectNoCheck(EndPoint remoteEP)上主动拒绝它...
所以看来我在客户端尽我所能,服务器听到敲门声,但是没有打开门 - 我是对的吗?
顺便说一下,出于好奇,我还添加了这段代码:string hostName = Dns.GetHostName();
MessageBox.Show(string.Format("host name is {0}", hostName));
...我看到“ WindowsCE ”
根据Andy Wiggly(编写“MS .NET Compact Framework”的cat / bloke)的this post,你做使用“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)。
那么从手持设备访问主机需要什么?
我已经尝试过客户端/ 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(Web 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,然后“ ......遇到严重错误,必须关闭”
这是它尝试调用服务器的地方但是,如上所述,它永远不会被调用的服务器方法......
事实证明这现在有效:
http://192.168.125.50:28642/api/
...它的主要原因是我的路由属性(GetUpdatedHHSetup)和我从客户端调用的内容(GetHHSetupUpdate)之间存在不匹配。一旦我对齐那些行星,NRE就会消失,我得到了预期的结果。
答案 0 :(得分:0)
uri /连接字符串中不需要PPP_PEER。使用主机PC的IP地址(以及服务器/ Web API应用程序的端口号)现在可以正常工作(在修复路由属性与客户端调用它之间的不匹配之后)。
我认为使用机器名也可以。