团队对话的Webhook订阅不适用于WCF中继

时间:2020-03-15 18:25:05

标签: wcf microsoft-graph-api microsoft-graph-webhooks

有人可以帮助我解决此问题。我无法从出错的地方进行调试。基本上,我已经使用Azure中的WCF中继创建了WCF Rest API WebService,以在内部部署和Azure之间建立混合连接。另外,如果我忽略任何证书验证,则该终结点适用于内部部署,因为它是自签名证书,但是在进行API调用时,在Azure中发布它时,我使用的是WCF Relay提供的base64编码的公共密钥。

WCF合同和实施:

Contract Interface

Implementation

我可以在WCF服务中成功获取“ validationToken”,并且还可以在5秒后立即返回相同的validateToken。返回后,它总是错误地显示此消息。

Postman Client For Sending HTTP Request

Error Response and no subscription created

EDIT

WCF合同

[OperationContract]
        [WebInvoke(Method = "POST", UriTemplate = "webhookForConservation?validationToken={validationToken}", 
            BodyStyle = WebMessageBodyStyle.Bare)]
        string webhookForConservation(WebhookPayload data, string validationToken);

WCF实施:

第一种返回200 OK状态代码的方法:

public string webhookForConservation(WebhookPayload data, string validationToken = "")
        {
            ServicePointManager.ServerCertificateValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;
            var client = new HttpClient();
            client.DefaultRequestHeaders.Add("Accept", "text/plain");
            client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json");
            HttpResponseMessage response = null;
            WebOperationContext ctx = WebOperationContext.Current;
            if (validationToken != null && validationToken != "")
            {
                response = client.PostAsync("http://localhost:8080/conversationWebHook/conversationSubscription?validationToken=" + validationToken, null).Result;
                var apiContent = response.Content.ReadAsStringAsync().Result;
                ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;
                ctx.OutgoingResponse.ContentType = "text/plain";
                return apiContent;
            }
            else
            {
                StringContent strContent = new StringContent(DataContractJsonSerializerHelper.SerializeJson(data));
                strContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
                response = client.PostAsync("http://localhost:8080/conversationWebHook/conversationSubscription", strContent).Result;
            }
            var result = (response != null) ? response.Content.ReadAsStringAsync().Result : "";
            ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;
            return result;
        }

返回200个状态代码的第二种方法:

public WebFaultException<string> webhookForConservation(WebhookPayload data, string validationToken="")
        {
            ServicePointManager.ServerCertificateValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;
            var client = new HttpClient();
            client.DefaultRequestHeaders.Add("Accept", "text/plain");
            client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json");
            HttpResponseMessage response = null;
            if (validationToken != null && validationToken != "")
            {
                response = client.PostAsync("http://localhost:8080/conversationWebHook/conversationSubscription?validationToken=" + validationToken, null).Result;
                var apiContent = response.Content.ReadAsStringAsync().Result;
                return new WebFaultException<string>(apiContent, HttpStatusCode.OK);
            }
            else
            {
                StringContent strContent = new StringContent(DataContractJsonSerializerHelper.SerializeJson(data));
                strContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
                response = client.PostAsync("http://localhost:8080/conversationWebHook/conversationSubscription", strContent).Result;
            }
            var result = (response != null) ? response.Content.ReadAsStringAsync().Result : "";
            return new WebFaultException<string>(result, HttpStatusCode.OK); ;
        }

从WCF服务返回200 OK响应代码后,看到相同的错误

Postman Client Throws Error

直接通过Postman调用Relay WCF API:

WCF API Call From Postman

标题:

WCF API Call Headers From Postman

预先感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

两个问题导致WCF中继无法正常工作:

  • 中继未将响应内容类型设置为text / plain,此问题已通过ctx.OutgoingResponse.ContentType = "text/plain"修复
  • 中继正在将XML包装器添加到所需的响应主体中,这可以通过将返回值更改为Stream来解决。