从 fiddler 或 Swift 而不是 js 调用 signalr

call signalr from fiddler or Swift instead of js

有没有办法在 Fiddler 或 Swift 中模拟此 js 发送给信号器的内容:

$(function () {
    // Declare a proxy to reference the hub.
    var chat = $.connection.chatHub;
    // Create a function that the hub can call to broadcast messages.
    chat.client.broadcastMessage = function (name, message) {
        // Html encode display name and message.
        var encodedName = $('<div />').text(name).html();
        var encodedMsg = $('<div />').text(message).html();
        // Add the message to the page.
        $('#discussion').append('<li><strong>' + encodedName
            + '</strong>:&nbsp;&nbsp;' + encodedMsg + '</li>');
    };
    // Get the user name and store it to prepend to messages.
    $('#displayname').val(prompt('Enter your name:', ''));
    // Set initial focus to message input box.
    $('#message').focus();
    // Start the connection.
    $.connection.hub.start().done(function () {
        $('#sendmessage').click(function () {
            // Call the Send method on the hub.
            chat.server.send($('#displayname').val(), $('#message').val());
            // Clear text box and reset focus for next comment.
            $('#message').val('').focus();
        });
    });
});

该页面驻留在通过我的 iis 服务器访问的 HTML 中: http://abc/HubSample/(abc是我的服务器名) 这是它调用的 C# 代码:

public class ChatHub : Hub
{
    public void Send(string name, string message)
    {
        // Call the broadcastMessage method to update clients.
        Clients.All.broadcastMessage(name, message);
    }
}

我也可以从其他服务器调用那个 html 页面。目标是在调用该方法时包括不同的客户端(不仅仅是 js 客户端)。

我试过在 Swift 中这样称呼它:

// Default is false
SwiftR.useWKWebView = true

// Default is .Auto
SwiftR.transport = .ServerSentEvents

// Hubs...
hubConnection = SwiftR.connect("http://abc/HubSample") { [weak self] connection in
    connection.queryString = ["foo": "bar"]
    connection.headers = ["X-MyHeader1": "Value1", "X-MyHeader2": "Value2"]

    // This only works with WKWebView on iOS >= 9
    // Otherwise, use NSUserDefaults.standardUserDefaults().registerDefaults(["UserAgent": "SwiftR iOS Demo App"])
    connection.customUserAgent = "SwiftR iOS Demo App"

    self?.simpleHub = connection.createHubProxy("simpleHub")
    self?.complexHub = connection.createHubProxy("complexHub")

    self?.simpleHub.on("broadcastMessage") { args in
        let message = args![0] as! String
        let detail = args![1] as! String
        print("Message: \(message)\nDetail: \(detail)\n")
    }

但我在 XCode 和 Safari 开发工具中不断收到此错误:

SwiftR unable to process message h0z81qhh: Error Domain=WKErrorDomain Code=5 "JavaScript execution returned a result of an unsupported type" UserInfo={NSLocalizedDescription=JavaScript execution returned a result of an unsupported type}

XMLHttpRequest cannot load http://abc/HubSample/signalr/negotiate?clientProtocol=1.5&foo=bar&connectionData=%5B%7B%22name%22%3A%22simplehub%22%7D%2C%7B%22name%22%3A%22complexhub%22%7D%5D&_=1463691894451. Origin null is not allowed by Access-Control-Allow-Origin.

从 Swift 调用它是理想的,但很高兴看到它可以从任何其他客户端(javascript 除外)访问它

有人试过吗!?

我可以在 Fiddler 中复制您想做的事情。将它插入你的小提琴手。确实触发了断点

http://localhost/HubSample/signalr/send?transport=serverSentEvents&connectionToken=Ez8n0rVK%2Bw%2F90yiLke%2Fv0jNiVkUi0fbJfNB3oLfhPb1QZqS5zrwZ6jY1kLGU0AISolwmjROEpxkgz0Otj72%2Bkjh8OgsE9KXZUybGPENX9rfQgK2y8IrFsveKpl7C75Wm&connectionData=%5B%7B%22name%22%3A%22chathub%22%7D%5D 数据={"H":"chathub","M":"Send","A":["joe","2"],"I" :1}

该错误表示您遇到以下问题之一:

  1. 无法从您的设备访问您的服务器 http://abc
  2. 您已将 SwiftR 配置为期望 SignalR 版本 2.2.0,但您实际上 运行 其他版本,例如 2.0.0。
  3. 您正在将 SwiftR 与 WKWebView 结合使用,但您尚未在服务器上启用 CORS。

更新到 SwiftR 版本 0.11.0,您会看到更好的错误消息。