团队会话的Webhook订阅不使用WCF中继

团队会话的Webhook订阅不使用WCF中继,wcf,microsoft-graph-api,microsoft-graph-webhooks,Wcf,Microsoft Graph Api,Microsoft Graph Webhooks,有人能帮我解决这个问题吗。我无法从出错的地方进行调试。基本上,我已经在Azure中使用WCF中继创建了一个WCF Rest API Web服务,以便在本地和Azure之间建立混合连接。另外,如果我忽略任何证书验证,该端点是用于内部部署的,因为它是自签名证书,但在进行API调用时,我在Azure中发布时使用WCF中继提供的base64编码公钥 WCF合同和实施: 我能够成功地在WCF服务中获得“validationToken”,并且在5秒以下立即返回相同的validationToken。返回后

有人能帮我解决这个问题吗。我无法从出错的地方进行调试。基本上,我已经在Azure中使用WCF中继创建了一个WCF Rest API Web服务,以便在本地和Azure之间建立混合连接。另外,如果我忽略任何证书验证,该端点是用于内部部署的,因为它是自签名证书,但在进行API调用时,我在Azure中发布时使用WCF中继提供的base64编码公钥

WCF合同和实施:

我能够成功地在WCF服务中获得“validationToken”,并且在5秒以下立即返回相同的validationToken。返回后,显示此消息时总是出错

编辑

WCF合同

WCF实施:

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

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

公共WebFaultException webhookForConservation(WebhookPayload数据,字符串validationToken=“”)
{
ServicePointManager.ServerCertificateValidationCallback=(发件人、证书、链、sslPolicyErrors)=>true;
var client=新的HttpClient();
client.DefaultRequestHeaders.Add(“接受”、“文本/普通”);
client.DefaultRequestHeaders.TryAddWithoutValidation(“内容类型”、“应用程序/json”);
HttpResponseMessage响应=null;
if(validationToken!=null&&validationToken!=“”)
{
响应=客户端。PostAsync(“http://localhost:8080/conversationWebHook/conversationSubscription?validationToken=“+validationToken,空)。结果;
var apiContent=response.Content.ReadAsStringAsync().Result;
返回新的WebFaultException(apicContent,HttpStatusCode.OK);
}
其他的
{
StringContent strContent=新的StringContent(DataContractJsonSerializerHelper.SerializeJson(数据));
strContent.Headers.ContentType=MediaTypeHeaderValue.Parse(“应用程序/json”);
响应=客户端。PostAsync(“http://localhost:8080/conversationWebHook/conversationSubscription“,strContent)。结果;
}
var result=(response!=null)?response.Content.ReadAsStringAsync()。结果:“”;
返回新的WebFaultException(结果,HttpStatusCode.OK);
}
从WCF服务返回200 OK响应代码后出现的相同错误

直接与邮递员调用中继WCF API:

标题:


提前感谢您提供的所有帮助。

有两个问题妨碍WCF继电器正常工作:

  • 中继未将响应内容类型设置为text/plain,这已通过
    ctx.OutgoingResponse.ContentType=“text/plain”
  • 中继正在向所需的响应体添加一个XML包装器,这是通过将返回值更改为Stream来解决的

您的继电器是否返回200状态代码进行验证?响应类型是否为文本/普通?您的中继服务是否返回验证令牌值?您好@baywet,非常感谢您的帮助。实际的应用程序是用Java编写的(使用SpringBoot),当使用ngrok时,它工作正常,我的订阅注册正确。在这之后,我使用了postman客户端并检查了请求头和响应头,它是您所要求的默认值。您的继电器是否为验证返回200状态代码?-是,响应类型为文本/普通?-是(由邮递员客户端确认)您的中继服务是否返回验证令牌值是的(由邮递员客户确认),所以它在您不使用正在构建的WCF中继时工作,但在您使用WCF中继时不工作?是的,您完全正确。根本不知道我哪里做错了。从你发布的代码中,我可以看出你在转发回复体。但是,不清楚您是否正在转发状态代码和内容类型,您能再检查一下吗?
[OperationContract]
        [WebInvoke(Method = "POST", UriTemplate = "webhookForConservation?validationToken={validationToken}", 
            BodyStyle = WebMessageBodyStyle.Bare)]
        string webhookForConservation(WebhookPayload data, string validationToken);
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;
        }
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); ;
        }