我有一个 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 发送通知。
经过多方排查,问题出在这段代码上:
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 通过代理正确发送请求。