C#端口到Linux Mono或.NET Core

时间:2016-12-27 19:31:30

标签: c# linux wcf mono .net-core

我有一个用C#编写的Windows服务。我需要让它在Linux上运行。我已经看过可能用Java或C ++重写代码,我可能会这样做,但作为一个中间解决方案,我正在考虑将项目移植到Mono或.NET Core。关键是它是一个相当小的应用程序,因此进行必要的代码更改不应该是太多的工作。

该服务侦听特定的URL端点以执行任务。

基于以下代码示例的示例:

http://localhost:5000/checkStatus?configId=1234

http://localhost:5000/echo

http://localhost:5000/version

事实上,我几乎已经编译了本节的预期。这一节正在生成我剩余的所有构建错误。据我所知,.NET Core中尚未提供WCF服务。所以我一直在寻找替代方案,但我很难在.NET Core中使用Linux。我还想避免实现一些等同于在完整的NGINX或Apache服务器中重写整个内容或鞋子的东西。

namespace CheckService
{
    [ServiceContract]
    interface IService
    {
        [OperationContract]
        [WebGet(ResponseFormat = WebMessageFormat.Json)]
        string checkStatus(string configId);

        [OperationContract]
        [WebGet(ResponseFormat = WebMessageFormat.Json)]
        string echo(string value);

        [OperationContract]
        [WebGet(ResponseFormat = WebMessageFormat.Json)]
        string version();
    }
}

我并不完全熟悉WCF,因为我从未使用它,而且这个项目最初是由其他人编写的。

这是我的project.json。我知道我可能会有一些不必要或不正确的项目。我经常测试一下:

{
  "buildOptions": {
    "emitEntryPoint": true,
    "debugType": "portable"
  },
  "dependencies" : {
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.0",
    "ServiceStack": "4.5.4",
    "System": "4.1.311.2",
    "System.IO": "4.3.0",
    "System.IO.Pipes": "4.0.0",
    "System.Collections": "4.0.11",
    "System.Data.Common": "4.0.0",
    "System.Data.SQLite": "1.0.0",
    "System.ServiceModel": "1.0.0",
    "System.ServiceModel.Web": "1.0.0",
    "System.ServiceModel.Primitives": "4.3.0",
    "System.ServiceModel.Security": "3.9.0",
    "System.ServiceModel.Http": "4.0.0",
    "slf4net.log4net": "0.1.32.1"
  },
  "frameworks": {
    "net461": {
      "frameworkAssemblies": {
        "System.Runtime.Serialization": "4.0.0.0",
        "System.ServiceModel": "4.0.0"
      }
    }
  },
  "tools": {
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": {
      "version": "1.0.0-preview2-final"
    }
  },
  "scripts": {
    "postpublish": "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%"
  }
}

我还有其他办法吗?

2 个答案:

答案 0 :(得分:1)

您对WebGetAttribute的使用表明您打算创建RESTful服务。虽然WCF在.NET Core中不可用,但支持WebApi。使用WebApi,您可以创建REST服务,这可能就是您所需要的。您可以查看this tutorial by Microsoft如何开始使用此功能。

答案 1 :(得分:0)

如果您尝试在.NET Core上运行ServiceStack,则应引用ServiceStack's .NET Core Release Notes中指示的1.0.* ServiceStack软件包:

"dependencies" : {
  "ServiceStack.Core": "1.0.*",
  "ServiceStack.Common.Core": "1.0.*",
  "ServiceStack.Client.Core": "1.0.*",
  "ServiceStack.Interfaces.Core": "1.0.*",
  "ServiceStack.Text.Core": "1.0.*"
},

或者,如果您没有使用https://servicestack.net,则应删除project.json中对“ServiceStack”的引用。