首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
SAAS
ToB门户
了解全球最新的ToB事件
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
微博
Follow
记录
Doing
博客
Blog
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
排行榜
Ranklist
相册
Album
应用中心
qidao123.com ToB IT社区-企服评测·应用市场
»
论坛
›
软件与程序人生
›
后端开发
›
.Net
›
WCF 服务容器化的一些问题
返回列表
发新帖
WCF 服务容器化的一些问题
[复制链接]
发表于 2023-1-2 04:54:56
|
显示全部楼层
|
阅读模式
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
×
背景
目前项目当中存有 .NET Framework 和 .NET Core 两种类型的项目,但是都需要进行
容器
化将其分别部署在 Windows 集群和 Linux 集群当中。在 WCF 进行
容器
化的时候,遇到了以下几个问题:
某些服务使用到了 WSHttpBinding 保护服务
安全
,要在
容器
里面加载 SSL 证书。
WCF 服务的
日志
,如何重定向到标准输出流?
解决
问题一
关于第一个问题,最开始我觉得只需要将 WCF 服务打包出来,暴露一个 HTTP 端点。然后在这个 WCF 服务的前面再加一层 NGINX,具体的证书由 NGINX 进行管理。大概的流程就是
API
Caller --> (HTTPS)F5 --> (HTTPS)NGINX --> (HTTP)WCF,按照这样的方式部署之后,对应的服务端点无法访问,具体的错误提示的是 Schema 不匹配。因为 WSHttpBinding 强制使用 HTTPS,如果我仅暴露一个 HTTP 端点,是无法绕过 WSHttpBinding 的限制的。
随后我又在网上找到了
这篇文章
,该文章的思路就是实现一个
CustomBinding
,然后在里面忽略掉这块验证,经过我的测试无法满足需求。
上述方法行不通就只有创建一个自签 SSL 证书,并导入到 IIS 当中,随后在 NGINX 启用 SSL 转发,目前看来已经解决这个问题。下面是我的 Dockerfile 以及入口点的 PowerShell 脚本,脚本里面包含了证书生成与导入方法。
dockerfile:
FROM mcr.microsoft.com/dotnet/framework/sdk:4.8 AS build
WORKDIR /build
COPY . .
RUN cd ./src; nuget restore
WORKDIR /build/src/ProjectName
RUN msbuild Wcf.csproj /p:Configuration=Release -r:False
FROM mcr.microsoft.com/dotnet/framework/wcf:4.8-windowsservercore-ltsc2019 AS runtime
WORKDIR /WcfService
EXPOSE 443
COPY --from=build /build/wcf-entrypoint.ps1 .
COPY --from=build /build/src/ProjectName .
ENTRYPOINT ["powershell", ".\\wcf-entrypoint.ps1"]
复制
代码
entrypoint.ps1
$hostName = $env:HostName
$port = "443"
$password = "Your password."
$storeLocation = "Cert:\LocalMachine\My"
$certificate = New-SelfSignedCertificate -DnsName $hostName -CertStoreLocation $storeLocation
$thumbPrint = $certificate.Thumbprint
$certificatePath = ("cert:\localmachine\my" + $certificate.Thumbprint)
$bindingInformation = "*:" + $port + ":" + $hostName
$securedString = ConvertTo-SecureString -String $password -Force -AsPlainText
Export-PfxCertificate -FilePath "C:\WcfService\temp.pfx" -Cert $certificatePath -Password $securedString
Import-PfxCertificate -FilePath "C:\WcfService\temp.pfx" -CertStoreLocation "Cert:\LocalMachine\Root" -Password $securedString
New-IISSite -Name "WcfService" -PhysicalPath C:\WcfService -BindingInformation $bindingInformation -CertificateThumbPrint $thumbPrint -CertStoreLocation $storeLocation -Protocol https
# Entry point for the application.
&C:\\ServiceMonitor.exe w3svc
复制
代码
问题二
由于 WCF 是托管在 IIS 里面的,我们的
日志
信息是无法输出到标准输出流的。所以我们就采取了一个曲线救国的方案,使用一个旁路程序,我们的
日志
输出到文件当中,由这个旁路程序
监控
文件变动,然后将变动的内容输出到标准输出流里面。
这个
功能
有点像 Logstash,你可能会说我们为什么不直接用 Logstash 收集这些日志呢?因为我们所有项目的日志,都是由基础架构团队统一处理。规范就是我们日志必须输出到标准输出流,并且日志是结构化日志,还需带上一些 ProjectId 之类的标记信息。然后由注入的 Sidecar 容器统一收集、处理、上报到 Garylog 平台。
回到正题,最开始我找到了微软实现的一个开源工具,它的本意就是为一些 Windows 容器解决日志收集问题的。
项目的地址是:
https://github.com/microsoft/windows-container-tools
。
使用这个工具,指定好路径与需要运行的程序,替换 Dockerfile 的入口点即可解决问题。微软那个工具的核心,就是使用了系统提供的文件监听
API
,在 .NET 里面也有提供类似的
API
,叫做
FileSystemWatcher
,如果有兴趣的话,也可以参考 C++ 的源码和思路自己实现。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复
使用道具
举报
返回列表
张国伟
+ 我要发帖
登录后关闭弹窗
登录参与点评抽奖 加入IT实名职场社区
去登录
微信订阅号
微信服务号
微信客服(加群)
H5
小程序
快速回复
返回顶部
返回列表