Skip to main content
 首页 » 编程设计

c#之从具有 FaultException 的 WCF Web 服务中消除天妇罗

2024年02月02日32zhenyulu

背景:

我最近将用户请求的内部身份验证添加到 Web 服务,并在身份验证失败时抛出自定义 FaultException。

已标记 FaultException 自定义类型:

[DataContract(Namespace = ConstantConfig.ServiceNamespace, Name = "AuthenticationError")] 
public class AuthenticationError 

服务接口(interface)方法已被标记:

[OperationContract] 
[FaultContract(typeof(AuthenticationError), Namespace = ConstantConfig.ServiceNamespace)] 
ClientReport GetClientReport(DateTime from, DateTime to); 

接口(interface)本身已经被标记:

[ServiceContract(Namespace = ConstantConfig.ServiceNamespace)] 
public interface IClientReportService 

接口(interface)的实现已经标注:

[ServiceBehavior(Namespace = ConstantConfig.ServiceNamespace)] 
public class ClientReportService : IClientReportService 

web.config 和 app.config 都指向复制/粘贴的服务命名空间。

然而,尽管如此,我仍然生成了一个 tempuri.wsdl。以下是 wsdl 的代表性摘录:

主要内容:

<?xml version="1.0" encoding="utf-8"?> 
<wsdl:definitions xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:wsa10="http://www.w3.org/2005/08/addressing" xmlns:tns="http://webservice.company.com/ClientReportService" xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:i0="http://tempuri.org/" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="ClientReportService" targetNamespace="http://webservice.company.com/ClientReportService" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> 
<wsdl:import namespace="http://tempuri.org/" location="http://localhost:4319/ClientReportService.svc?wsdl=wsdl0" /> 
<wsdl:types> 
<xsd:schema targetNamespace="http://webservice.company.com/ClientReportService/Imports"> 
    <xsd:import schemaLocation="http://localhost:4319/ClientReportService.svc?xsd=xsd0" namespace="http://webservice.company.com/ClientReportService" /> 
    <xsd:import schemaLocation="http://localhost:4319/ClientReportService.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/" /> 
</xsd:schema> 
</wsdl:types> 

天妇罗:

<wsdl:operation name="GetClientReport"> 
  <soap:operation soapAction="http://webservice.company.com/ClientReportService/IClientReportService/GetClientReport" style="document" /> 
  <wsdl:input> 
    <soap:body use="literal" /> 
  </wsdl:input> 
  <wsdl:output> 
    <soap:body use="literal" /> 
  </wsdl:output> 
  <wsdl:fault name="AuthenticationErrorFault"> 
    <soap:fault use="literal" name="AuthenticationErrorFault" namespace="" /> 
  </wsdl:fault> 
</wsdl:operation> 

我猜有些东西我没有标记或标记不正确,但我找不到它。

有什么建议吗?

请您参考如下方法:

试试这个

<endpoint address="" 
                          binding="basicHttpBinding" 
                          bindingNamespace="http://my.namespace.com" 
                          contract=""/> 
            </service>