Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有办法让OWIN托管SOAP服务? 如何让OWIN托管SOAP端点(不管是否涉及WCF,SOAP提供了WSDL,这使得某些客户端更容易使用服务,这就是为什么我需要SOAP和REST)_C#_Wcf_Rest_Soap_Owin - Fatal编程技术网

C# 有没有办法让OWIN托管SOAP服务? 如何让OWIN托管SOAP端点(不管是否涉及WCF,SOAP提供了WSDL,这使得某些客户端更容易使用服务,这就是为什么我需要SOAP和REST)

C# 有没有办法让OWIN托管SOAP服务? 如何让OWIN托管SOAP端点(不管是否涉及WCF,SOAP提供了WSDL,这使得某些客户端更容易使用服务,这就是为什么我需要SOAP和REST),c#,wcf,rest,soap,owin,C#,Wcf,Rest,Soap,Owin,我猜想答案是:实现自己的中间件,它承载一个SOAP端点。如果这是答案,那就这样吧,但这是一个很大的工作,所以如果是这样的话,我可能会坚持使用WCF并避免使用OWIN。我发现很难相信还没有人实现SOAP托管中间件 通常,我们喜欢在服务上同时使用REST和SOAP端点;目前,我们使用IIS和WCF restful位来承载具有[ServiceContract]/[OperationContract]属性的SOAP,其余部分使用[WebInvoke]属性定义,使用这些属性,服务不需要为不同的端点类型重

我猜想答案是:实现自己的中间件,它承载一个SOAP端点。如果这是答案,那就这样吧,但这是一个很大的工作,所以如果是这样的话,我可能会坚持使用WCF并避免使用OWIN。我发现很难相信还没有人实现SOAP托管中间件


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

我们只是使用ASP.NET路由添加新的
ServiceRoute
s,它使用与URI/soap的soap绑定相同的服务将rest绑定添加到URI/rest

现在,我们正在考虑做一些新的服务工作,我想继续使用OWIN,这样我们就可以实现我们的新服务,不依赖于主机,因为windows服务主机将更好地为某些服务提供服务,而IIS服务主机将更好地为某些服务提供服务

我所有的事情都在摆弄,到目前为止,我还没有办法得到一个由OWIN托管的SOAP端点。通过让我的服务继承自
ApiController
,然后在OWIN应用程序的
配置
方法中使用以下代码片段,我可以很好地处理其余部分:

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

在OWIN基础设施上托管WCF基础设施并不是那么容易,当然这是可能的,只需做一点工作,就可以调整或将所属的请求-响应层代理给WCF基础设施;WCF提供了一个不那么简单但完整的基础设施来完成类似的工作。

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

如果您的主要目标只是开始使用OWIN编写新服务,而您仍然计划使用OWIN将它们托管在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");
            });
    }
}
可能对某些人有效,但对我无效,因为我在Owin中设置了其他文件系统,并且我无法同时获得这两种行为(在需要时回退到其他处理程序并通过Owin管道)

这是使它对我起作用的配置:

  • 在自动启动中使用Owin(删除任何
    appSettings
    named
    Owin:AutomaticAppStartup
  • 不要在web.config中手动添加其处理程序(否则启动将运行两次)(从web.config中的
    中删除owinhttphandler)
  • builder.UseFileServer()之后添加
    appBuilder.UseStageMarker(PipelineStage.MapHandler)
    • UseFileServer
      必须在您设置的所有管道之后进行,否则在它之后设置的管道将无法工作,您将获得404
  • 可以选择像前面提到的cpower那样分叉管道

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

    这根本不能回答我的问题。我不关心WCF,我只想要一个SOAP端点。我真的很抱歉我没有很好地看到问题的标题。向我道歉。别担心,我不是针对个人的,只是说这不是我想要的信息。我非常感谢你的努力和尝试!