2016-02-08 188 views
1

這裏是我做了什麼:如何在IIS託管的網站上收到自定義webhook?

1 - 我已經安裝了NuGet包:Microsoft.AspNet.WebHooks.Receivers.Custom 1.2.0-β

2 - 我配置了WebApiConfig以接收自定義網絡掛接:

public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

     config.InitializeReceiveCustomWebHooks(); //<<<--- 
    } 

3 - 我設立在web.config密鑰:

<appSettings> 
    <add key="webpages:Version" value="3.0.0.0" /> 
    ... 
    <add key="MS_WebHookReceiverSecret_GenericJson" value="z=SECRET"/> 
    </appSettings> 

4 - 我已經寫了BA SIC接收器(與genericjson鉤捕獲)

public class GenericJsonWebHookHandler : WebHookHandler 
{ 
    public static string dataReceived; 
    public GenericJsonWebHookHandler() 
    { 
     this.Receiver = "genericjson"; 
    } 

    public override Task ExecuteAsync(string generator, WebHookHandlerContext context) 
    { 
     // Get JSON from WebHook 
     JObject data = context.GetDataOrDefault<JObject>(); 

     if (context.Id == "i") 
     { 
      // do stuff 
     } 
     else if (context.Id == "z") 
     { 
      // do more stuff 
      dataReceived = data.ToString(); 

      File.Create(@"c:\test\test1.txt"); 
     } 

     return Task.FromResult(true); 
    } 
} 

現在,人們所期望的與上面的步驟,如果網絡掛接發送方設置爲發佈JSON來託管網站上的IIS,它應該捕捉通知作爲JSON,捕獲的數據分配給dataReceived和寫入空白的文本文件c:\test\test.txt - 這是不是這種情況

目前,我正在測試這種使用Team Foundation Server的一個網絡掛接測試發送到https://mywebbhooksite.com:5050/?z=SECRET,和它成功 - 然而,當我檢查這個小測試文件是否是crea特德,它不在那裏。我還在主頁上運行了一些JavaScript來輪詢dataReceived的任何更改,但是我看不到任何事情正在發生。

提的:​​我有附加到w3wp.exe進程遠程調試器,在ExecuteAsync和GenericJsonWebHookHandler斷點沒有被擊中

是否有需要爲了做任何其他特定設置webhook被捕獲?

+1

您確定您的'context.Id'包含az嗎?我看到它的一個參數名稱,但在這個例子中,我不清楚「context」的內容是什麼。我會驗證你正在通過你的'if/else' if語句正確。 – Tommy

+1

另外 - 你確定你的應用程序有寫訪問該特定位置? – Tommy

+1

@Tommy說了些什麼。你需要做更多的調試。使用記錄器或在本地測試您的處理程序。你不能只將它轉儲到服務器上,並期望我們在腦海中進行調試。如果您想在服務器上調試它,請從「ExecuteAsync」中刪除所有不相關的代碼,並在其中只轉儲一個'File.Create()'語句,僅此而已。 99%的機會IIS用戶帳戶沒有權限寫入'C:\ test'。 – CodeCaster

回答

1

我參加了一個骯髒的做法,工作

我拋棄GenericJsonWebHookHandler,而是我已經用在WebApiApplicationApplication_BeginRequest()事件,而不是攔截張貼由發送方網絡掛接數據。鉤的主體駐留在HttpRequest.Request.Inputstream中,可以使用流式閱讀器打開它。內容可以被讀取到一個string並解析成JObject(如果由webhook請求發送的請求的主體是JSon)

這是我的代碼。

protected void Application_BeginRequest() 
    { 
     if (!Request.HttpMethod.Equals("post", StringComparison.InvariantCultureIgnoreCase)) { 
      return; 
     } 

     string documentContents; 
     using (var receiveStream = Request.InputStream) 
     { 
      using (var readStream = new StreamReader(receiveStream, Encoding.UTF8)) 
      { 
       documentContents = readStream.ReadToEnd(); 
      } 
     } 

     try 
     { 
      var json = JObject.Parse(documentContents); 
      File.WriteAllLines(@"C:\test\keys.txt", new[] { documentContents, "\r\n", json.ToString() }); 
     } 
     catch (Exception) 
     { 
      // do something 
     } 
    } 

測試:

我去到我的網絡掛接,並開始了網絡掛接測試。它向json發佈了請求。 HTTP 200是來自服務器的響應。

斷點被擊中。 HttpMethod接過帖子。請求的InputStream被讀取並存儲在documentContents中。 JObject.Parse發了,把帖子的內容到名爲json

一個JObject變量的json內容被寫入到存儲在服務器上的文件 - 表示請求被正確接收。

我打算做什麼來改善這一點,出於安全

爲了安全起見,我將加密密鑰我在web.config中設置,並設置在web.config中的加密密鑰,而不是,然後將其與傳入的URL查詢參數(使用相同的加密算法)進行匹配,以查看該密鑰是否存在並且完全相同

相關問題