0

我创建了一个 SignalR 服务器、一个 Web 客户端和一个使用 PhoneGap Build 构建的移动应用程序。当我使用 lite-server、PhoneGap CLI 或 PhoneGap 桌面应用程序启动 PhoneGap 应用程序时,SignalR 在 Web 客户端和 PhoneGap 应用程序之间完美运行。这包括使用 PhoneGap 移动应用程序连接到 PhoneGap 桌面应用程序。唯一一次失败是当我使用 PhoneGap Build 构建它并在设备上安装 APK 时。我对此错误没有任何解释。

我已经通过服务器的 WEB.CONFIG 处理了 CORS。它是一个普通的 ASP.NET 应用程序,只有一个 OWIN 启动文件来配置 SignalR 和一个 Hub 类。

 <system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE, TOKEN" />
        <add name="Access-Control-Allow-Credentials" value="false"/>
      </customHeaders>  
    </httpProtocol>
 </system.webServer>

令人沮丧的部分是 $.connection.hub.start 失败时产生的错误只是“错误:协商请求期间出错”

当'deviceready'事件触发时,我调用initialSignalR()

var appConfig = {
    'serverUrl': "http://wolf-signalrserver.azurewebsites.net"
}

var initiateSignalR = function(){
    if ($.signalR) {

    }

    var username = prompt("username");
    var success = `
                <div class ="serverMessage">
                    <span>--- WELCOME, ${username} ---</span>
                </div>
            `
    $('#chatbox').append(success)




        $.connection.hub.logging = true
        $.connection.hub.qs = { 'username': username }
        $.connection.hub.url = appConfig.serverUrl + "/signalr";
        var chatHub = $.connection.chatHub

        chatHub.client.broadcastMessage = function (name, message) {
            console.log("Data Incoming ---- Name: " + name + " Message: " + message);
            var message = `
                <div class="row">
                    <span class="col-sm-2">${name}:</span> 
                    <span class="col-sm-9"> ${message}</span>
                </div>
            `
            $('#chatbox').append(message)
        }


        $('#messageButton').on('click', function () {
            chatHub.server.send(username, $('#messageBox').val())
        })
        $('#messageForm').on('submit', function (e) {
            e.preventDefault();
            chatHub.server.send(username, $('#messageBox').val())
        })

        $.connection.hub.start({ withCredentials: false, jsonp: true })
            .done(function () {
                console.log("Connected successfully to SignalR");
                var success = `
                    <div class ="serverMessage">
                        <span>--- Successfully connected to the server ---</span>
                    </div>
                `
                $('#chatbox').append(success)
            })
            .fail(function (err) {
                console.log("Unable to connect to SignalR")
                alert(err);
            })
}

我在这里有一个 git repo:https ://github.com/PhilWolf91/SignalR

我意识到这里有很多问题,但没有一个人对他们如何修复它有详细的答案。例如:SignalR .Net 客户端在设备上失败,出现 500 服务器错误,在模拟器上工作正常

4

1 回答 1

0

好的。我是个大白痴。当我清理 Config.Xml 时,我删除了网络权限和默认的白名单插件。

<feature name="http://api.phonegap.com/1.0/network" />
<gap:plugin name="cordova-plugin-whitelist" source="npm" />

此项目的完整功能配置

<?xml version='1.0' encoding='utf-8'?>
<widget id="com.wolf.signalrphonegap" version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:gap="http://phonegap.com/ns/1.0">
    <name>SignalRPhoneGap</name>
    <description>
        Hello World sample application that responds to the deviceready event.
    </description>
    <author email="phillip.wolf91@gmail.com" href="http://phillipwolf91.wordpress.com">
        Wolf Software
    </author>

    <feature name="http://api.phonegap.com/1.0/network" />
    <gap:plugin name="cordova-plugin-whitelist" source="npm" />
    <content src="index.html" />
    <preference name="DisallowOverscroll" value="true" />
    <preference name="android-minSdkVersion" value="14" />
    <platform name="android">
    </platform>    
    <access origin="*" />
    <allow-intent href="http://*/*" />
    <allow-intent href="https://*/*" />
    <allow-intent href="tel:*" />
    <allow-intent href="sms:*" />
    <allow-intent href="mailto:*" />
    <allow-intent href="geo:*" />
    <platform name="android">
        <allow-intent href="market:*" />
    </platform>

</widget>

我现在让 SignalR 在设备上安装的服务器、Web 客户端和 PhoneGap 应用程序之间工作

于 2017-05-08T19:05:52.003 回答