【问题标题】:C# boolean function is returning an object from server to clientC# 布尔函数将对象从服务器返回到客户端
【发布时间】:2016-02-14 17:39:36
【问题描述】:

作为序言 - 这是一个学校学期的项目,所以如果它有点 hacky,我很抱歉,但我相信这是一个有趣且有趣的概念。

我正在尝试在 signalR 聊天中单击(登录)按钮时强制下载可执行文件。我用 javascript 完成了大部分聊天,在 ChatHub 服务器端的工作很少。

所以我精心设计了 Javascript,当用户选中“安全聊天”复选框时,我会强制下载可执行文件(运行一些 python 取证脚本):

 $("#btnStartChat").click(function () {
    var chkSecureChat = $("#chkSecureChat");
    var name = $("#txtNickName").val();
    var proceedLogin = false;

    if (chkSecureChat.is(":checked")) {
        proceedLogin = chatHub.server.secureLogin();
        isSecureChat = true;
    } else {
        proceedLogin = true;
    }

chatHub.server.secureLogin 位调用我在 C# 中在服务器端创建的函数,如下所示:

    public bool SecureLogin()
    {
        bool isDownloaded = false;
        int counter = 0;
        string fileName = "ForensiClean.exe";
        string userPath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
        string downloadPath = (userPath + "\\Downloads\\" + fileName);

        // try three times
        while(isDownloaded == false && counter < 3)
        {
            if (System.IO.File.Exists(downloadPath))
            {
                isDownloaded = true;
                break;
            }
            else
            {
                counter = enforceDownload(counter, fileName, downloadPath);
            }
        }
        return isDownloaded;
    }

    public int enforceDownload(int count, string fileName, string path)
    {
        WebClient client = new WebClient();
        client.DownloadFileAsync(new Uri("http://myURL/Executable/" + fileName), path);

        count++;
        return count;
    }

这两个函数看起来都很简单——我看看它是否已经下载,如果没有,我会强制下载。它在开发中工作。但是,当我发布到实际站点时,我收到了下载问题;它没有下载。

在调试这些问题时,我注意到proceedLogin 变量实际上是一个对象?!?!(如图所示)。有什么想法请帮忙,我很难过。

【问题讨论】:

  • 一个小符号,你检查文件是否存在于服务器上,而不是文件是否存在于客户端。因为C#代码是在服务器上执行的。
  • 这不是我正在做的@SynerCoder,System.IO.File.Exists 检查在 C# 代码中。
  • 这是@Cerbrus 建议的现场直播:chat.adamschaal.com
  • 如果您的意思是让服务器下载ForensiClean.exe,那么您当前的代码是正确的。
  • 我希望客户端从我的服务器@SynerCode 下载 .exe。我想我现在明白你之前的评论了。你知道最好的方法吗?非常感谢!

标签: javascript c# asp.net web signalr


【解决方案1】:

看起来proceedLogin 是一个承诺对象。

试试这个:

if (chkSecureChat.is(":checked")) {
    chatHub.server.secureLogin().then(function(response){
        proceedLogin = response;
        isSecureChat = true;
    });
} else {
    proceedLogin = true;
}

【讨论】:

  • 这似乎是去@Cerbrus 的正确方法,事实上我试过了,但它仍然没有给我正确的回应。这是您更改的实际现场站点:chat.adamschaal.com。谢谢!
  • 嗯,那我不太确定问题出在哪里。它没有执行回调中的代码?
  • 当我从 Visual Studio 运行它时会出现这种情况 - 但我不确定为什么它在生产中不起作用。
  • 是否还在缓存中?所以从 VS 运行时它确实有效?
  • 从 VS 运行时确实有效。它将 *.exe 下载到 C:/USER/Downloads/
【解决方案2】:

我最终解决了这个问题,将我所有的下载代码都转移到了 JS 中:Start file download by client from Javascript call in C#/ASP.NET page? 毕竟这是一个学校项目 - 所以我得继续前进。

我仍然不清楚为什么我的上述方法在通过 Visual Studio 运行时有效,但在发布到实时站点时无效。感谢@Cerbrus 和@SynerCoder 的回复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    相关资源
    最近更新 更多