我正在努力从外部位置提供内部应用程序。为了实现这一点,我正在研究不同的选项,例如使用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 controllerType
和NotifyAsync
NotifyAllAsync
和Filter(
。类实例)。客户端OWIN主机保持肯定,因为它是echoable,并且客户端输出显示它实际上确实从服务器接收消息但是我崩溃了。