有没有办法让OWIN托管SOAP服务?

时间:2014-03-21 17:25:02

标签: c# wcf rest soap owin

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

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


作为一项规则,我们喜欢在我们的服务上执行REST和SOAP端点;目前我们使用IIS和WCF restful位来托管具有[ServiceContract] / [OperationContract]属性的SOAP,其余的用[WebInvoke]属性定义,这些属性服务不需要重新实现不同的端点类型。

我们只是使用ASP.NET路由添加新的ServiceRoute,它使用与绑定到URI / SOAP的SOAP相同的服务添加对URI / REST的休息绑定。

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

我摆弄所有东西,到目前为止,我无法得到OWIN托管的SOAP端点。通过让我的服务继承自ApiController,然后在OWIN应用程序的Configuration方法中使用这一小段代码,我处理好了其余部分:

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

3 个答案:

答案 0 :(得分:2)

MSDN上有一个自定义OWIN中间件示例,说明如何支持SOAP请求。它不是通用的WCF主机,但可能足以暴露您现有的WCF服务(即[ServiceContract / OperationContract])在ASP.NET核心应用程序中。该示例不包括对[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");
            });
    }
}

答案 1 :(得分:1)

通过OWIN承载WCF基础设施并不是那么容易,确定它是可能的,通过一些工作,它可以很明显地适应,或代理欠申请 - 响应层到WCF基础设施; WCF提供了一个不那么容易但完整的基础设施来做类似的事情。

答案 2 :(得分:0)

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

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

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

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