Firebase Admin SDK c# 从 WCF 服务器发送通知被卡住

问题描述 投票:0回答:1

我有一个 WCF(Windows Communication Foundation)服务器。最近,我尝试更新从基本 https 请求到 Firebase Admin SDK 的通知发送。

我在控制台版本中使用的代码在我的机器上完美运行。另一方面,同一台机器上的 WCF 使用的相同代码在发送时仍然被阻止。

这是我使用的方法:

public static async Task<string> SendMessage(string deviceId, string message, string IdSem, string UrlResponseSEM,
    string Auth_Message = "", string auth_key = "", bool isAuthMessageDansNotif = true)
{
    string color = "#0072C6";
    bool hasErrors = false;
    List<string> logList = new List<string> { "[=FCM_SendMessage=]" };

    try
    {
        logList.Add($"[deviceId:{deviceId}] [message:{message}] [IdSem:{IdSem}] [Auth_Message:{Auth_Message}] [color:{color}]");
        logList.Add($"[isAuthMessageDansNotif:{isAuthMessageDansNotif}]");

        Message messagingMessage = null;
        if (isAuthMessageDansNotif)
        {
            messagingMessage = new Message
            {
                Token = deviceId,
                Data = new Dictionary<string, string>
                {
                    { "time", DateTime.Now.ToString() },
                    { "idsem", IdSem },
                    { "urlresponse", UrlResponseSEM },
                    { "message", message },
                    { "auth_message", Auth_Message },
                    { "auth_key", auth_key }
                }
            };
        }
        else
        {
            messagingMessage = new Message
            {
                Token = deviceId,
                Data = new Dictionary<string, string>
                {
                    { "time", DateTime.Now.ToString() },
                    { "idsem", IdSem },
                    { "urlresponse", UrlResponseSEM },
                    { "message", message }
                }
            };
        }

        string postData = JsonConvert.SerializeObject(messagingMessage);
        logList.Add($"[postData={postData}]");

        LogSeo.MyLog.Debug("FCM_SENDING_MESSAGE ...");

        var response = await FirebaseMessaging.DefaultInstance.SendAsync(messagingMessage).ConfigureAwait(false);
        LogSeo.MyLog.Debug("FCM_SENDING_MESSAGE OK");

        return response;
    }
    catch (Exception ex)
    {
        hasErrors = true;
        logList.Add($"ERROR > {ex.GetAllExceptions()} {ex.StackTrace}");
        return $"ERROR:{ex.Message}";
    }
    finally
    {
        logList.Add("[=FCM_SendMessage=]");
        string strLog = string.Join(Environment.NewLine, logList);
        if (hasErrors)
        {
            LogSeo.MyLog.Error(strLog);
        }
        else
        {
            LogSeo.MyLog.Debug(strLog);
        }
    }
}

该方法在以下行仍然被阻止:

var response = await FirebaseMessaging.DefaultInstance.SendAsync(messagingMessage).ConfigureAwait(false);

您能告诉我是什么原因导致了这个问题吗?

请注意,我使用的是代理,并且计算机上可能还有防火墙。有没有特定的端口需要解锁?

如果是这样,这如何在我的可执行文件中工作?

预先感谢您的帮助,祝您有美好的一天,

我尝试从我的 WCF 通过 FCM 发送通知。

c# firebase firebase-cloud-messaging firebase-admin
1个回答
0
投票

经过多方排查,问题出在这段代码上:

options.HttpClientFactory = new ProxyAwareHttpClientFactory();
//...
public class ProxyAwareHttpClientFactory : HttpClientFactory
{
    protected override HttpMessageHandler CreateHandler(CreateHttpClientArgs args)
    {
        var httpClientHandler = new HttpClientHandler
        {
            Proxy = new WebProxy(GlobalSettings.ProxyUrl, GlobalSettings.ProxyPort),
            UseProxy = true
        };
        return httpClientHandler;
    }
}

我认为这段代码将允许 Firebase 通过 ProxyAwareHttpClientFactory 中指定的代理发送消息。然而事实并非如此,没有使用代理。为了解决这个问题,我在 web.config 文件中指定了代理,如下所示:

在我的 web.config 中:

<system.net>  
    <defaultProxy enabled="true" useDefaultCredentials="true">  
      <proxy  
        usesystemdefault="true"  
        proxyaddress="http://myproxy:8080"  
        bypassonlocal="true"  
      />  
    </defaultProxy>  
  </system.net>

这允许 FCM 通过代理正确发送请求。

© www.soinside.com 2019 - 2024. All rights reserved.