Подписка Webhook для Команды не работает с ретранслятором WCF - PullRequest
0 голосов
/ 15 марта 2020

Может кто-нибудь, пожалуйста, помогите мне решить эту проблему. Я не могу отлаживать, где это идет не так. По сути, я создал WCF Rest API WebService с использованием WCF Relay в Azure, чтобы иметь гибридное соединение между локальной и Azure. Также, если я игнорирую какую-либо проверку сертификата, эта конечная точка предназначена для локального использования, поскольку это самозаверяющий сертификат, но при выполнении вызова API я использую закодированный base64 ключ publi c, предоставленный ретранслятором WCF при публикации его в * 1093. *.

Контракт и реализация WCF:

Интерфейс контракта

Реализация

Я успешно могу чтобы получить «validationToken» в сервисе WCF, а также возвращать тот же validationToken сразу же менее 5 секунд. После возврата всегда выдается сообщение об ошибке.

Почтовый клиент для отправки HTTP-запроса

Ответ об ошибке и подписка не создана

РЕДАКТИРОВАТЬ

Контракт WCF

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

Реализация WCF:

1-й подход к возвращению 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;
        }

2-й подход для возврата кода состояния 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); ;
        }

Такая же ошибка наблюдается после возврата кода ответа 200 OK из службы WCF

Postman Client Throws Error

Вызов API-интерфейса WCF-реле напрямую с почтальоном:

WCF API Call From Postman

Заголовки:

WCF API Call Headers From Postman

Заранее спасибо за всю помощь.

1 Ответ

1 голос
/ 19 марта 2020

Две проблемы мешали правильной работе реле WCF:

  • Реле не устанавливало тип содержимого ответа на текст / обычный, это было исправлено с ctx.OutgoingResponse.ContentType = "text/plain"
  • Ретранслятор добавлял оболочку XML к требуемому телу ответа, это было решено путем изменения возвращаемого значения на Stream
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...