如何在XSockets中使用C#客户端API获取/设置属性

劳登维尔

在XSockets Server API中,有一个示例,说明如何使用JavaScript API在服务器控制器上获取/设置属性。

从客户端API获取/设置属性

如果您拥有带有公共getter或setter的属性,则可以从客户端API的getter / setter方法访问

public string MyProp {get;set;}

可以从客户端API(JavaScript和C#)中检索和更改上面的属性。有关如何通过JavaScript设置新值的示例

conn.publish('set_MyProp',{value:'NewValue'});

有关更多信息,请参见客户端API。

但是客户端API的页面上没有任何信息

我很难确定JavaScript代码的等效C#客户端代码 conn.publish('set_MyProp',{value:'NewValue'});

非常感谢您的帮助。

劳登维尔

好吧,通过尝试一个错误,我发现了一个困难的办法:

Client.Send(new { value = "NewValue" }, "set_MyProp");

等效于以下代码:

conn.publish('set_MyProp',{value:'NewValue'});

注意“值”的情况!!!不要大写这个词!

更新

我创建了两个扩展方法,这些方法使获取和设置属性值变得非常容易(还有一个WaitForConnection在某些类似同步的场景(例如单元测试)中很有用)。

由于XSockets(非常不幸)不是开源的,并且文档很少,所以我不得不猜测事情是如何工作的,因此我的扩展方法可能不像我能够读取源代码时那样高效和简洁。我从服务器读取属性的方法可能有点“过分小心” ...如果有人知道如何进行改进,请编辑答案或在评论部分中提出建议:

public static class XSocketClientExtensions
{
    public static bool WaitForConnection(this XSocketClient client, int timeout=-1) {
        return SpinWait.SpinUntil(() => client.IsConnected, timeout);
    }

    public static void SetServerProperty(this XSocketClient client, string propertyName, object value) {
        client.Send(new { value = value }, "set_" + propertyName);
    }

    public static string GetServerProperty(this XSocketClient client, string propertyName) {
        var bindingName = "get_" + propertyName;
        // why event name is lowercase? 
        var eventName = bindingName.ToLowerInvariant();
        // we must be careful to preserve any existing binding on the server property
        var currentBinding = client.GetBindings().FirstOrDefault(b => b.Event == eventName);
        try {
            // only one binding at a time per event in the client
            if (currentBinding != null)
                client.UnBind(bindingName);
            var waitEvent = new ManualResetEventSlim();
            string value = null;
            try {
                client.Bind(bindingName, (e) => {
                    value = e.data;
                    waitEvent.Set();
                });
                // we must "Trigger" the reading of the property thru its "event" (get_XXX)
                client.Trigger(bindingName);
                // and wait for it to arrive in the callback
                if (waitEvent.Wait(5000))
                    return value;
                throw new Exception("Timeout getting property from XSockets controller at " + client.Url);
            } finally {
                client.UnBind(bindingName);
            }
        } finally {
            // if there was a binding already on the "property getter", we must add it back
            if (currentBinding != null) 
                client.Bind(bindingName, currentBinding.Callback);
        }
    }
}

用法轻而易举:

// Custom controller
public class MyController : XSocketController
{
    public int Age { get; set; }

    public override void OnMessage(ITextArgs textArgs) {
        this.SendToAll(textArgs);
    }
}

// then in the client
var client = new XSocketClientEx("ws://127.0.0.1:4502/MyController", "*");
client.WaitForConnection(); // waits efficiently for client.IsConnected == true
client.SetServerProperty("Age", 15);
int age = Convert.ToInt32(client.GetServerProperty("Age"));

您可以跳过以下内容,这简直就是!

一些事情使得从一开始就很难确定它。JavaScript客户端和C#客户端之间没有协议。因此,您从一种中学到的知识不会转化为另一种技术。在我自己的多语言客户端API上,我尝试使所有API都表现出来并且看起来非常相似(如果不相同),因此代码几乎可以移植。我有一个在JavaScript,C#和Java中看起来几乎相同的API。

困扰我的差异是:

  1. 这些方法具有不同的名称:publish在JavaScript与SendC#中
  2. 参数以相反的顺序传递:value, event在C#中,event, value在JavaScript中
  3. 本身没有区别,但是如果您在C#示例中使用“值”将不起作用,则必须使用“值” ...我不认为它应该区分大小写... 这样做的理由令人信服。那我就别再吵了!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Delphi中使用HTTP客户端API

来自分类Dev

如何在C#中使用NEST客户端的ElasticClient类中的Serialize方法?

来自分类Dev

如何使用服务器端C#在客户端更改表单属性

来自分类Dev

如何在Akka 2.4.6中使用TCP客户端设置SSL?

来自分类Dev

如何在 WEB API 中使用 SignalR 2,从 API 和客户端调用 SignalR 方法

来自分类Dev

如何在Java中使用Jenkins客户端获取Jenkins工作详细信息列表

来自分类Dev

如何在blazor服务器应用中使用signalr从http客户端获取令牌?

来自分类Dev

如果服务器关闭,如何在C#中使gRPC客户端超时?

来自分类Dev

在C#客户端中使用SqlGeography类型

来自分类Dev

如何在Azure Functions C#中获取客户端IP地址?

来自分类Dev

如何在Azure Functions C#中获取客户端IP地址?

来自分类Dev

如何在Meteor中使用本机客户端库?

来自分类Dev

如何在HTTPS中使用客户端证书?

来自分类Dev

如何在Python中使用DICT协议客户端?

来自分类Dev

如何在客户端代码中使用节点模块?

来自分类Dev

如何在CXF客户端中使用PATCH方法

来自分类Dev

如何在Typescript中使用“ dialogflow”客户端库?

来自分类Dev

如何在Blazor客户端中使用Socket?

来自分类Dev

如何在Python中使用dialogflow客户端

来自分类Dev

如何在客户端JavaScript中使用打字稿?

来自分类Dev

如何在Meteor中使用本机客户端库?

来自分类Dev

如何在本机客户端中使用CORS机制

来自分类Dev

如何在存储中使用客户端githook?

来自分类Dev

如何在片段中使用 GoogleAPI 客户端

来自分类Dev

如何在Advanced REST API客户端中使用Chrome中的Cookie

来自分类Dev

如何在客户端JavaScript中使用Grafana Http API

来自分类Dev

如何在客户端JavaScript中使用Grafana Http API

来自分类Dev

如何使用客户端API设置p:selectOneRadio的值?

来自分类Dev

如何在C#中使用反射从类型和设置属性值中按名称获取属性

Related 相关文章

  1. 1

    如何在Delphi中使用HTTP客户端API

  2. 2

    如何在C#中使用NEST客户端的ElasticClient类中的Serialize方法?

  3. 3

    如何使用服务器端C#在客户端更改表单属性

  4. 4

    如何在Akka 2.4.6中使用TCP客户端设置SSL?

  5. 5

    如何在 WEB API 中使用 SignalR 2,从 API 和客户端调用 SignalR 方法

  6. 6

    如何在Java中使用Jenkins客户端获取Jenkins工作详细信息列表

  7. 7

    如何在blazor服务器应用中使用signalr从http客户端获取令牌?

  8. 8

    如果服务器关闭,如何在C#中使gRPC客户端超时?

  9. 9

    在C#客户端中使用SqlGeography类型

  10. 10

    如何在Azure Functions C#中获取客户端IP地址?

  11. 11

    如何在Azure Functions C#中获取客户端IP地址?

  12. 12

    如何在Meteor中使用本机客户端库?

  13. 13

    如何在HTTPS中使用客户端证书?

  14. 14

    如何在Python中使用DICT协议客户端?

  15. 15

    如何在客户端代码中使用节点模块?

  16. 16

    如何在CXF客户端中使用PATCH方法

  17. 17

    如何在Typescript中使用“ dialogflow”客户端库?

  18. 18

    如何在Blazor客户端中使用Socket?

  19. 19

    如何在Python中使用dialogflow客户端

  20. 20

    如何在客户端JavaScript中使用打字稿?

  21. 21

    如何在Meteor中使用本机客户端库?

  22. 22

    如何在本机客户端中使用CORS机制

  23. 23

    如何在存储中使用客户端githook?

  24. 24

    如何在片段中使用 GoogleAPI 客户端

  25. 25

    如何在Advanced REST API客户端中使用Chrome中的Cookie

  26. 26

    如何在客户端JavaScript中使用Grafana Http API

  27. 27

    如何在客户端JavaScript中使用Grafana Http API

  28. 28

    如何使用客户端API设置p:selectOneRadio的值?

  29. 29

    如何在C#中使用反射从类型和设置属性值中按名称获取属性

热门标签

归档