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# 使单个WCF服务同时支持SOAP、REST和WSDL_C#_Wcf_Rest_Soap_Wsdl - Fatal编程技术网

C# 使单个WCF服务同时支持SOAP、REST和WSDL

C# 使单个WCF服务同时支持SOAP、REST和WSDL,c#,wcf,rest,soap,wsdl,C#,Wcf,Rest,Soap,Wsdl,我正在尝试在.NET3.5中构建一个C#服务,它支持SOAP(并显示WSDL)和REST 使用ServiceHost和BasicHttpBinding类可以很容易地生成SOAP服务和WSDL。工作顺利,客户很高兴 因为SOAP调用都使用简单的参数,所以客户机开发人员为一些命令请求了一个REST接口。因此,我将ServiceHost类更改为WebServiceHost,添加了必要的WebInvoke和WebGet属性,添加了WebHttpBinding类,bingo-REST和SOAP都使用一个服

我正在尝试在.NET3.5中构建一个C#服务,它支持SOAP(并显示WSDL)和REST

使用
ServiceHost
BasicHttpBinding
类可以很容易地生成SOAP服务和WSDL。工作顺利,客户很高兴

因为SOAP调用都使用简单的参数,所以客户机开发人员为一些命令请求了一个REST接口。因此,我将ServiceHost类更改为
WebServiceHost
,添加了必要的
WebInvoke
WebGet
属性,添加了
WebHttpBinding
类,bingo-REST和SOAP都使用一个服务。很酷,改变一个界面,REST和SOAP都得到了新东西

但有一个问题——不再生成WSDL。我无法浏览并获取WSDL文件。检查MSDN文档,这似乎是默认的
WebServiceHost
的行为

问题:我是否可以重写此行为以便可以获取WSDL?不必像以前一样使用相同的URL—它可以更改—但我只需要将一些URL转换为服务,以便为这些SOAP开发人员获取WSDL。

当您说“添加了WebHttpBinding类”时,听起来您在代码中而不是在配置文件中进行大量配置

如果是这种情况,您可以尝试将配置移动到配置文件中。然后为契约创建两个端点,一个REST和一个SOAP,具有两个不同的地址和绑定

但是有一个问题——WSDL不再存在了 生成。我无法浏览到 并得到 WSDL文件。检查MSDN文档, 这似乎是一个年轻人的行为 默认WebServiceHost

是的-这是REST的缺点之一-没有更多的WSDL,没有更多的机器可读的服务描述。您需要希望服务提供商提供一份关于您可以做什么的可用且最新的文档

休息期间没有WSDL。无法打开或任何东西-它根本不存在


目前正在努力提供类似的东西,称为(Web应用程序描述语言),但据我所知,它还远远没有成为一个既定的标准。另请参见:?

大约在2007年,WSDLV2.0应该能够描述RESTful服务。我发现,对于.NETV4.0中的WCF,从纯RESTful服务生成的WDSL是无效的(WSDLV1.0?)

我创建了一个类似的项目,该项目同时公开SOAP和RESTful端点,并通过修改接口(如您所做的)来启用它:

    // Get all Categories - complex object response
    [OperationContract]                             // categories
    [WebGet(BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "GetAllCategories")]
    CategoryCollection GetAllCategories();          // SubSonic object
    [OperationContract]                             // categories - respond with a JSON object
    [WebGet(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "GetAllCategories.JSON")]
    CategoryCollection GetAllCategoriesJSON();      // SubSonic object
需要注意的是,对于所有SOAP请求,所有输入参数现在都必须是字符串类型


有没有办法解决这个问题?

我用代码进行所有配置,而不是配置文件。一种解决方案是使用两个端点,而这种解决方案确实可以很好地工作。我希望使用一个端点;单个端口和根URL。我认为您无法从WebHttpBinding端点获取WSDL。我可以理解REST将没有WSDL,但请记住,该服务同时处理REST和SOAP请求。只是SOAP客户端不能再请求WSDL了。我们的目标是拥有一个单一的服务和一个侦听端口,它可以同时为REST、SOAP和WSDL提供服务,所有这些都基于URL路径。解决方案也存在类似的问题。你好,杰森,我想知道你是否仍在使用这种方法,以及它对你是否有效。您是否发现必须复制任何方法(核心逻辑)以支持这两种方法?我只需要创建两个端点并为每个命令添加一个额外的属性。是否有办法在SOAP和REST中公开完全相同的方法,而不是为每个旧SOAP方法添加一个新方法?