【问题标题】:Any way to get OWIN to host a SOAP service?有什么方法可以让 OWIN 托管 SOAP 服务?
【发布时间】:2014-03-21 17:25:01
【问题描述】:

如何让 OWIN 托管 SOAP 端点(不管是否涉及 WCF,SOAP 提供 WSDL,这使得某些客户端更容易使用服务,这就是我想要 SOAP 和 REST 的原因)

我怀疑答案是:实现您自己的托管 SOAP 端点的中间件。如果这就是答案,那就这样吧,但这是很多工作,所以如果是这种情况,我可能最终会坚持使用 WCF 并避免使用 OWIN。我很难相信还没有人实现过 SOAP 托管中间件...


通常,我们喜欢在我们的服务上同时使用 REST 和 SOAP 端点;目前我们使用 IIS 和 WCF RESTful 位来承载具有 [ServiceContract]/[OperationContract] 属性的 SOAP,其余部分使用 [WebInvoke] 属性定义,使用这些属性,服务无需针对不同的端点类型重新实现。

我们只是使用 ASP.NET 路由来添加新的ServiceRoutes,它添加​​了一个到 URI/REST 的 REST 绑定,其服务与肥皂绑定到 URI/SOAP 的服务相同。

现在我们正在考虑做一些新的服务工作,我想继续使用 OWIN,这样我们就可以通过托管不可知论来实现我们的新服务,因为 Windows 服务托管可以更好地为某些服务提供服务,而某些服务将得到更好的服务通过 IIS 服务托管。

我所有的东西都在摆弄,到目前为止,我想不出任何方法来获得由 OWIN 托管的 SOAP 端点。通过让我的服务继承自 ApiController,然后在 OWIN 应用程序的 Configuration 方法中使用这个小 sn-p 代码,我可以很好地处理其余部分:

    public void Configuration(IAppBuilder app)
    {
        HttpConfiguration config = new HttpConfiguration();
        config.MapHttpAttributeRoutes();
        app.UseWebApi(config);
        [...]

【问题讨论】:

    标签: c# wcf rest soap owin


    【解决方案1】:

    MSDN 上有一个自定义 OWIN 中间件示例,展示了如何支持 SOAP 请求。它不是通用 WCF 主机,但可能足以公开您现有的 WCF 服务(即 [ServiceContract/ OperationContract]) 在 ASP.NET Core 应用程序中。该示例不包括对 [WebGet/WebInvoke] 的支持,但可能足以让您入门。

    https://blogs.msdn.microsoft.com/dotnet/2016/09/19/custom-asp-net-core-middleware-example/

    如果您的主要目标只是开始使用 OWIN 编写新服务,并且您仍计划使用 Microsoft.Owin.Host.SystemWeb 在 IIS 中托管它们。您可以忽略 OWIN 管道中的 WCF 请求,并允许 IIS ASP.NET 管道处理它们。这将使您能够编写结合了 OWIN 中间件和传统 WCF 端点的服务。

    public static class WCFAppBuilderExtensions
    {
        public static IAppBuilder IgnoreWCFRequests(this IAppBuilder builder)
        {
            return builder.MapWhen(context => IsWCFRequest(context), appBuilder =>
            {
                // Do nothing and allow the IIS ASP.NET pipeline to process the request
            });
        }
    
        private static bool IsWCFRequest(IOwinContext context)
        {
            // Determine whether the request is to a WCF endpoint
            return context.Request.Path.Value.EndsWith(".svc", StringComparison.OrdinalIgnoreCase);
        }
    }
    

    然后在配置你的应用时调用IgnoreWCFRequests扩展方法。

    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            var config = new HttpConfiguration();
            WebApiConfig.Register(config);
            app
                .IgnoreWCFRequests()
                .UseWebApi(config)
                .Run(context =>
                {
                    return context.Response.WriteAsync("Default Response");
                });
        }
    }
    

    【讨论】:

      【解决方案2】:

      在 OWIN 基础架构上托管 WCF 基础架构并不容易,当然可以,通过一些工作很明显可以适应,或者将所欠的请求-响应层代理到 WCF 基础架构; WCF 提供了一个不那么简单但完整的基础架构来执行类似的操作。

      【讨论】:

      • 这根本无法回答我的问题。我不关心 WCF,我只想要一个 SOAP 端点。
      • 真的很抱歉没看清楚问题的标题。向我道歉。
      • 别担心,我的意思不是私人的,只是说这并不完全符合我想要的信息。不过,我非常感谢您的努力和尝试!
      【解决方案3】:

      cpowers answer 可能适用于某些人,但不适用于我,因为我在 Owin 中设置了其他文件系统,我无法同时获得这两种行为(需要时回退到其他处理程序并通过 OWIN 管道)。

      这是使它对我有用的配置:

      1. 使用 Owin 自动启动(删除任何名为 appSettingsowin:AutomaticAppStartup
      2. 不要在您的 web.config 中手动添加其处理程序(否则启动将运行两次)(从您的 web.config 中的 <handlers> 删除 OwinHttpHandler)
      3. builder.UseFileServer() 之后添加appBuilder.UseStageMarker(PipelineStage.MapHandler)
        • UseFileServer 必须在您设置完所有管道之后发生,否则在它之后设置的那些将不起作用,您将得到 404
      4. 可以选择分叉管道,如提到的 cpower

      如果您的 OWIN 管道没有为您的遗留东西所在的路径注册中间件,您甚至不需要分叉您的管道(我的情况)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-20
        • 2011-12-13
        相关资源
        最近更新 更多