在Windows窗体应用程序

时间:2017-09-08 10:15:35

标签: c# asp.net winforms asp.net-web-api2 webhooks

我正在努力从外部位置提供内部应用程序。为了实现这一点,我正在研究不同的选项,例如使用rest API或使用套接字服务器,它可以放在旧应用程序和服务器上的数据库之间。最终产品的一个问题是,如果多个用户更改相同的数据并将其发送到服务器,则可能会覆盖彼此的更改。为此计划的方法是有一个服务器端数据更改日志,并通知用户相关数据已被更改,以便他们选择重新加载其表单。后一部分是我的问题出现的问题。与套接字不同,Web协议不能双向工作。我发现的潜在修复是轮询,框架和WebHook,后者似乎是最有效的。

然而,看看不同的可用WebHook接收器样本,他们似乎有一些共同之处。他们使用MVC或WebAPI,并且都添加了WebConfig,其中添加了方法config.InitializeCustomWebHooks();

我一直试图通过改变Program.cs而没有成功来找到一种方法来添加它。

此外,我尝试使用HttpClient找到一个与Hooks有关的方法(到目前为止,我已用于其余的演示应用程序),WebClient和{{ 1}}。然而,这种搜索也没有任何成果。也是尝试完成类似事情的人(有一个Windows窗体应用程序听GitHub)的唯一帖子,我找到了[响应] [1]让我相信webhooks和windows窗体不会一起。< / p>

此搜索结束时我想知道或:

是否有可能使用Windows窗体应用程序使用API​​ 2服务WebHooks? 如果可能的话,我想知道如何做到这一点?

现在我的API 2服务器已根据[Asp.Net]提供的示例进行了大量修改[2] 我的客户已经实施了来自HttpResponse的{​​{1}}。

编辑下一期:

注意:客户端和服务器都包含与回购中使用的相同的包,如Peter Bons所示。

客户端在CustomWebHookHandler中包含一个密钥,与订阅方法中的密钥匹配,并且已调用新的CustomReceiver(我能够向客户端发送回送信息)托管服务器)以便该部分正常工作。注册类也与示例repo

匹配

客户端使用以下方法启动webhook:

app.config

其中地址接收器与用于启动可回传网络服务的字符串相同。

调试方法后,将发生以下操作服务器/客户端: 在包含Startup.cs public void SubscribeTo(String subscribeString) { HttpResponseMessage result; // Create a webhook registration Registration registration = new Registration { WebHookUri = $"{adressReceiver}/api/webhooks/incoming/custom", Description = "A message is posted.", Secret = "12345678901234567890123456789012", Filters = new List<string> { "EmployeeChanged" } }; result = client.PostAsJsonAsync(@"webhooks/registrations", registration).Result; string resultString = result.ToString(); } 触发的服务器端调试点的行上。

在return方法中,它显示返回1个文件管理器,result =CustomFilterProvider.GetFiltersAsync返回客户端,Name包含"EmployeeChanged" 在该方法期间,客户端具有系统输出:

  

ClientApp.exe信息:0:已注册&#39; IWebHookReceiver&#39;具有以下名称的实例:custom。

     

ClientApp.exe信息:0:使用接收器处理传入的WebHook请求&#39; custom&#39;和id&#39;&#39;。

     

ClientApp.exe信息:0:已注册的配置设置&#39;自定义&#39;用于ID&#39;&#39;。

服务器: 应用程序见解遥测(未配置):

resultString

应用程序洞察遥测(未配置):

StatusCode: Created

经过一番研究后,我对此输出的推理是服务器向客户端发出的ip发送一个echo请求,以查看它是否是可达目的地。代码{ "name": "Microsoft.ApplicationInsights.Dev.RemoteDependency", "time": "2017-09-12T10:16:25.8947601Z", "tags": { "ai.internal.nodeName": "PC-78.vericon.nl", "ai.operation.id": "1348c1c9-4b7a5ac6dd5f1940", "ai.cloud.roleInstance": "PC-78.vericon.nl", "ai.internal.sdkVersion": "rdddsd:2.4.1-1362" }, "data": { "baseType": "RemoteDependencyData", "baseData": { "ver": 2, "name": "GET /api/webhooks/incoming/custom", "id": "|1348c1c9-4b7a5ac6dd5f1940.", "data": "http://localhost:55999/api/webhooks/incoming/custom?echo=e9f7b03ca8aa4226a7a9dfc99dacff16", "duration": "00:00:00.2046329", "resultCode": "200", "success": true, "type": "Http", "target": "localhost:55999", "properties": { "DeveloperMode": "true" } } } } 也意味着服务器找到了此地址,否则会出现代码{ "name": "Microsoft.ApplicationInsights.Dev.Request", "time": "2017-09-12T10:14:50.0204275Z", "tags": { "ai.internal.nodeName": "PC-78.vericon.nl", "ai.operation.name": "POST /api/webhooks/registrations", "ai.operation.id": "lXKbEdh4GOU=", "ai.location.ip": "::1", "ai.cloud.roleInstance": "PC-78.vericon.nl", "ai.internal.sdkVersion": "web:2.4.1-1362" }, "data": { "baseType": "RequestData", "baseData": { "ver": 2, "id": "|lXKbEdh4GOU=.1348c1c8_", "name": "POST /api/webhooks/registrations", "duration": "00:01:36.1228603", "success": true, "responseCode": "201", "url": "http://localhost:55997/api/webhooks/registrations", "properties": { "DeveloperMode": "true" } } } }

所以我认为webhook在应用程序中得到了正确的建立我有一个向服务器发出post请求的方法。我在服务器端方法中放置了一个调试点,看看会发生什么(在我的客户端处理程序中也是一个调试点)。

执行客户端操作后,应该让我在我的控制器中的调试点确实在我的方法中被触发:

created

当单步执行时,它沿着返回BadRequest的路线行进 客户端收到系统输出:

  

ClientApp.exe信息:0:使用接收器处理传入的WebHook请求&#39; custom&#39;和id&#39;&#39;。

然而,客户端处理程序中的调试点永远不会被触发。 现在的处理程序看起来像:

public async Task<IHttpActionResult> Post(Employee e)
    {
        await this.NotifyAsync(CustomFilterProvider.EmployeeChanged, new { Employee = e });
        if (EmployeeModifier.updateEmployee(e))
        {
            log.Info("User: " + User.Identity.Name + " Updated an employee with the following new value " + Newtonsoft.Json.JsonConvert.SerializeObject(e));
            return Ok();
        }
        else
        {
            log.Error("User: " + User.Identity.Name + " failed to update an employee");
            return BadRequest();
        }         
    }

我的客户Ok() class CustomWebHookHandler : WebHookHandler { public CustomWebHookHandler() { } public override Task ExecuteAsync(string generator, WebHookHandlerContext context) { System.Windows.Forms.MessageBox.Show("In handler"); return Task.FromResult(true); } } 方法如下:

startup.cs

因此它包含Configuration

我希望这对你来说是足够相关的代码,我担心我的服务器只向我的客户端发送echo / ping请求。

但我不知道如何改变这一点,因为我在客户public void Configuration(IAppBuilder appBuilder) { var config = new HttpConfiguration(); var controllerType = typeof(WebHookReceiversController); config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( "DefaultApi", "api/{controller}/{id}", new { id = RouteParameter.Optional } ); config.InitializeReceiveCustomWebHooks(); var traceWriter = config.EnableSystemDiagnosticsTracing(); traceWriter.IsVerbose = true; traceWriter.MinimumLevel = TraceLevel.Error; appBuilder.UseWebApi(config); } 中有var controllerTypeNotifyAsync NotifyAllAsyncFilter(。类实例)。客户端OWIN主机保持肯定,因为它是echoable,并且客户端输出显示它实际上确实从服务器接收消息但是我崩溃了。

0 个答案:

没有答案