为什么同一个应用程序中的相同确切代码崩溃,而另一个应用程序中的代码?

时间:2013-11-15 01:01:38

标签: c# visual-studio rest asp.net-web-api windows-ce

我正在尝试从客户端应用程序调用应用程序中的Web API Rest方法。我有两个客户端应用程序 - 一个,它可以工作,另一个,它没有。

调用REST方法的代码是相同的。当然, 是完全相同的服务器代码。

在失败的客户端应用程序中,它在此行上失败:

var webResponse = (HttpWebResponse)webRequest.GetResponse();

...并且两个应用程序中的代码完全相同,直到失败,除了失败的代码在事件处理程序中,而工作的代码不在。好吧,另外(相关的)差异,除了在事件处理程序中的测试代码,以及在单独的方法中的“真实”代码,是单独的方法也在一个单独的类中。为什么这会有所作为,我不知道,但我有点在这里抓住稻草。这是:

Cursor.Current = Cursors.WaitCursor;
try
{
    // Cannot start with String.Empty or " "; they both fail for some reason - Controller method is not even called.
    string lastIDFetched = "0";
    const int RECORDS_TO_FETCH = 100;
    bool moreRecordsExist = true;

    try
    {
        while (moreRecordsExist)
        {
            string formatargready_uri = string.Format("http://localhost:28642/api/InventoryItems/{0}/{1}", lastIDFetched, RECORDS_TO_FETCH);
            var webRequest = (HttpWebRequest)WebRequest.Create(formatargready_uri); 
            // GET is the default method/verb, but it's here for clarity
            webRequest.Method = "GET";
            var webResponse = (HttpWebResponse)webRequest.GetResponse();// <-- this throws an exception when there is no longer any data left

失败方法的定义:

private void buttonGetInvItemsInBlocks_Click(object sender, EventArgs e)

工作方法的定义:

public static List<HHSUtils.InventoryItem> GetBatchOfInventoryItems()

在失败的那一行上,最后一行的F10直接进入异常块(转到被认为是有害的 - 不开玩笑!),但异常没有显示任何内容 - 将鼠标悬停在这一行上:

catch (Exception ex)

...我只看到,“异常| System.Exception     base {object} |对象

两个客户端都是在Visual Studio 2008中构建的,目标是.NET 3.5;服务器是VS 2013,.NET 4.5.1

这是一个线索,我想:失败的代码将目标设备设置为“Windows CE设备”(它部署到手持设备,我通过“Windows CE的远程显示控制”控制)

有人在这里与他们内心的Columbo有联系吗?

更新

我改变了代码:

var webResponse = (HttpWebResponse)webRequest.GetResponse();

......对此:

using (var webResponse = (HttpWebResponse)webRequest.GetResponse())

......它没有任何区别 - 它仍然从该行直接跳转到catch块,在显示的异常中没有有用的数据。

在我的测试应用中,我更改了代码以使用“更好”的方式(使用);它可以任意方式工作,而另一个应用程序既不工作。 IOW:使用using很好,但在这种情况下没有什么区别。

更新2

为了回应JayC的回答,我尝试了以下所有“连接字符串” - 所有结果完全相同:

string uri = string.Format("http://localhost:28642/api/InventoryItems/{0}/{1}", lastIDFetched, RECORDS_TO_FETCH); // Fails on "using" line below with no usable exception data
//string uri = string.Format("http://192.112.263.38:28642/api/InventoryItems/{0}/{1}", lastIDFetched, RECORDS_TO_FETCH); <-- same failure
//string uri = string.Format("http://192.112.263.38/api/InventoryItems/{0}/{1}", lastIDFetched, RECORDS_TO_FETCH); <-- same failure
//string uri = string.Format("http://192.112.263.38:80/api/InventoryItems/{0}/{1}", lastIDFetched, RECORDS_TO_FETCH); <-- same failure
//string uri = string.Format("http://192.112.263.38:777/api/InventoryItems/{0}/{1}", lastIDFetched, RECORDS_TO_FETCH); <-- same failure
//string uri = string.Format("http://192.112.263.38:28642/api/inventoryItems/{0}/{1}", lastIDFetched, RECORDS_TO_FETCH); <-- same failure
//string uri = string.Format("http://192.112.263.38/api/inventoryItems/{0}/{1}", lastIDFetched, RECORDS_TO_FETCH); <-- same failure
//string uri = string.Format("http://192.112.263.38:80/api/inventoryItems/{0}/{1}", lastIDFetched, RECORDS_TO_FETCH); <-- same failure
//string uri = string.Format("http://192.112.263.38:777/api/inventoryItems/{0}/{1}", lastIDFetched, RECORDS_TO_FETCH); <-- same failure

更新3

回应罗曼格鲁伯关于CAS的评论:维基百科有一个消除CAS的消歧页面(http://en.wikipedia.org/wiki/Cas_(disambiguation)),但这种背景似乎没有任何可能的可能性。

主要文章OTOH在计算部分有几个CAS首字母缩略词。您指的是以下哪一项:

Central Authentication Service, a single sign-on protocol
Channel Associated Signaling, a type of communication signaling
Code Access Security in the Microsoft .NET framework

更新4

好的,我添加了几只猫建议的代码:

catch (WebException webex)
{
    HttpWebResponse hwr = (HttpWebResponse) webex.Response;
    HttpStatusCode hsc = hwr.StatusCode;
    MessageBox.Show(string.Format("{0} Status code == {1}", webex.Message, hsc.ToString()));
}

......这就是断点到达时我看到的内容:

enter image description here

这是错误的消息显示:

“远程服务器返回错误:(400)错误请求。状态代码==错误请求”

我认为问题出在“连接字符串”中;从Update 2中可以看出,我已经尝试了所有我能想到的东西,没有任何方法可以将设备连接到桌面。

5 个答案:

答案 0 :(得分:2)

失败的应用程序部署到手持设备,但uri设置为localhost ??

您可能希望使用解析为托管服务的实际计算机的主机名。

编辑:我对Windows CE设备一无所知,但似乎应该有更简单的方法从部署到设备的设备获取更明确的异常信息。我怀疑这是你需要解决的主要问题,如果碰巧你的直接问题恰好通过我上面提到的解决了。我希望它可以在app.config文件中设置像debug="True"那样微不足道,但我必须研究它。

答案 1 :(得分:1)

只是一个长镜头:两个应用程序之间的线程有什么区别吗?如果我理解正确,失败的应用程序将从主线程(从按钮事件处理程序)调用网络代码。如果你这样做,Android会导致你的应用程序崩溃(以防止主线程阻塞)。但我不知道Windows CE是否有类似的系统......

答案 2 :(得分:1)

我会尝试这个作为答案,从问题中澄清我的笔记:

1。:CAS =代码访问安全性 - 抱歉,我认为这个首字母缩略词在.NET环境中很常见。

2:使用服务器验证请求:

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.Credentials = new NetworkCredential("username", "password");

但是:我刚刚意识到其他的东西......以前的答案和/或问题误导了我,示例代码中的滚动条也没有帮助。这是抛出异常的“WebRequest.Create”方法?那还没有访问任何网络。它既不是主机名/ IP地址,也不是在这种情况下相关的任何凭据。 可以仍然与CAS相关。但更有可能的是,这是一个格式错误的URI ......

尝试添加

MessageBox.Show(formatargready_uri);

在调用WebRequest.Create之前,查看您的应用在设备上生成的URL。 URI解析也可能是“轻量级的”。 接下来,我建议在catch-block中使用一个消息框:

catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

3:广告网络连接:您所指示的是,您可以从PC上看到设备,但设备是否可以看到网络?打开设备上的Web浏览器,尝试访问网络上的任何页面以验证...

答案 3 :(得分:1)

您是否尝试在没有调试器的CE设备上运行应用程序?只是好奇是否只在调试环境中发生故障。

此外,Roman Gruber提出了一个很好的问题,我没有看到回应:

  

您可以在PC上看到设备,但设备是否可以看到网络?   打开设备上的网络浏览器,尝试访问网络上的任何页面以验证...

答案 4 :(得分:0)

我必须将它添加到C:\ Users \ clay \ Documents \ IISExpress \ config \ applicationhost.config:

<binding protocol="http" bindingInformation="*:28642:shannon2" />

...并在我的代码中使用此“连接字符串”:

http://shannon2:28642/api/InventoryItems

现在我可以连接;我认为我之前非常接近(如此接近,但又如此遥远),但它必须是这种确切的组合才能发挥作用。