加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – WCF配置AddressFilter不匹配

发布时间:2020-12-15 08:01:32 所属栏目:百科 来源:网络整理
导读:我有WCF配置问题.我有一个WCF Web服务,我希望能够使用GET参数通过Web浏览器访问(最终在 PHP中使用simplexml_load_file()).我的Visual Studio解决方案被设置为一个WCF服务库项目,其中包含一个接口(定义服务的位置),一个类(实现服务的地方,以及一个默认存在的a
我有WCF配置问题.我有一个WCF Web服务,我希望能够使用GET参数通过Web浏览器访问(最终在 PHP中使用simplexml_load_file()).我的Visual Studio解决方案被设置为一个WCF服务库项目,其中包含一个接口(定义服务的位置),一个类(实现服务的地方,以及一个默认存在的app.config).我也有一个WCF服务项目,包含.svc文件(指向我的类)和web.config.我的服务接口设计如下:
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using RTXEngineLib.externalLibrary;
namespace RTXEngineLib {
    [ServiceContract(Name = "RTXEngine",Namespace = "")]
    public interface IRTXEngine {
        [OperationContract(Name = "GetCountryList"),WebGet(UriTemplate = "/GetCountryList/",ResponseFormat = WebMessageFormat.Xml)]
        List<Country> GetCountryList();
        [OperationContract(Name = "GetRegions"),WebGet(UriTemplate = "/GetRegions/?countryID={countryID}",ResponseFormat = WebMessageFormat.Xml)]
        List<Region> GetRegions(int countryID);
        [OperationContract(Name = "GetExchangeAvailability"),WebGet(UriTemplate = "/GetExchangeAvailability/?countryID={countryID}&month={month}&year={year}&regionID={regionID}&resortID={resortID}",ResponseFormat = WebMessageFormat.Xml)]
        AvailabilityList GetExchangeAvailability(int countryID,String month,int year,String regionID = "?",String resortID = "");
        [OperationContract(Name = "GetResortsForDate"),WebGet(UriTemplate = "/GetResortsForDate/?month={month}&year={year}",ResponseFormat = WebMessageFormat.Xml)]
        List<AvailabilityList> GetResortsForDate(String month,int year);
        [OperationContract(Name = "GetRegionLists"),WebGet(UriTemplate = "/GetRegionLists/",ResponseFormat = WebMessageFormat.Xml)]
        List<RegionList> GetRegionLists();
        [OperationContract(Name = "GetRegionListCacheState"),WebGet(UriTemplate = "/GetRegionListCacheState/",ResponseFormat = WebMessageFormat.Xml)]
        Boolean GetRegionListCacheState();
    }
    [DataContract(Namespace = "")]
    public class LoginRequestResponse {
        [DataMember]
        public Boolean Success { get; set; }
        [DataMember]
        public AccountStanding AccountStanding { get; set; }
        [DataMember]
        public double FTXBalance { get; set; }
        [DataMember]
        public List<User> Users { get; set; }
        [DataMember]
        public List<ContractData> Contracts { get; set; }
    }
    [DataContract(Namespace = "")]
    public enum AccountType {
        [DataMember]
        NonAuthenticatedAccount,[DataMember]
        AC,[DataMember]
        PT,[DataMember]
        Wks
    }
    [DataContract(Namespace = "")]
    public enum AccountStanding {
        [DataMember]
        NotAuthenticated,[DataMember]
        Good,[DataMember]
        Mixed,[DataMember]
        Delinquent
    }
    [DataContract(Namespace = "")]
    public struct RegionList {
        [DataMember]
        public String CountryName { get; set; }
        [DataMember]
        public String CountryID { get; set; }
        [DataMember]
        public List<Region> Regions { get; set; }
    }
    [DataContract(Namespace = "")]
    public struct Country {
        [DataMember]
        public String CountryName { get; set; }
        [DataMember]
        public String ID { get; set; }
    }
    [DataContract(Namespace = "")]
    public struct Region {
        [DataMember]
        public String RegionName { get; set; }
        [DataMember]
        public String ID { get; set; }
    }
    [DataContract(Namespace = "")]
    public struct User {
        [DataMember]
        public String FirstName { get; set; }
        [DataMember]
        public String LastName { get; set; }
        [DataMember]
        public String Address { get; set; }
        [DataMember]
        public String City { get; set; }
        [DataMember]
        public String State { get; set; }
        [DataMember]
        public String Zip { get; set; }
        [DataMember]
        public String CountryOfResidence { get; set; }
        [DataMember]
        public String PhoneNumber { get; set; }
    }
    [DataContract(Namespace = "")]
    public struct ContractData {
        [DataMember]
        public String ContractID { get; set; }
        [DataMember]
        public AccountType AccountType { get; set; }
        [DataMember]
        public AccountStanding AccountStanding { get; set; }
        [DataMember]
        public String AvailablePoints { get; set; }
        [DataMember]
        public String UnavailablePoints { get; set; }
        [DataMember]
        public String Usage { get; set; }
    }
    [DataContract(Namespace = "")]
    public struct PointsData {
        [DataMember]
        public String ContractID { get; set; }
    }
    [DataContract(Namespace = "")]
    public class GlobalAppCache {
        [DataMember]
        public static DateTime RegionListsLastUpdate { get; set; }
        [DataMember]
        public static List<RegionList> CachedRegionLists { get; set; }
    }
}

我的库的App.config看起来像这样:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup,System,Version=4.0.0.0,Culture=neutral,PublicKeyToken=5555555555555555">
      <section name="RTXEngineLib.Properties.Settings" type="System.Configuration.ClientSettingsSection,PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
    </sectionGroup>
  </configSections>
  <system.web>
    <compilation debug="true"/>
  </system.web>
  <!-- When deploying the service library project,the content of the config file must be added to the host's 
  app.config file. System.Configuration does not support config files for libraries. -->
  <system.serviceModel>
    <services>
      <service name="RTXEngineLib.RTXEngineLib">
        <endpoint address="" binding="wsHttpBinding" contract="RTXEngineLib.IRTXEngineLib">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8732/Design_Time_Addresses/RTXEngineLib/RTXEngineLib/" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information,set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="True"/>
          <!-- To receive exception details in faults for debugging purposes,set the value below to true.  Set to false before deployment 
          to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="False"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
  <applicationSettings>
    <RTXEngineLib.Properties.Settings>
      <setting name="RTXEngineLib_externalLibrary" serializeAs="String">
        <value>http://externalLibrary.com/websvcs/externalLibrary.asmx</value>
      </setting>
    </RTXEngineLib.Properties.Settings>
  </applicationSettings>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>

然后我的Web.config如下:

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <bindings>
      <webHttpBinding>
        <binding name="Web" sendTimeout="00:03:00" maxBufferSize="131072"
          maxReceivedMessageSize="131072" />
      </webHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="Basic" name="RTXEngineLib.RTXEngineLib">
        <endpoint address="http://devrtxengine.telemark/RTXService.svc"
          binding="webHttpBinding" bindingConfiguration="Web" name="Basic"
          contract="RTXEngineLib.IRTXEngine" listenUri="http://devrtxengine.myserver/RTXService.svc" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
        <behavior name="Basic">
          <serviceMetadata httpGetEnabled="true" />
        </behavior>
        <behavior name="Web">
          <serviceMetadata httpGetEnabled="true" httpGetBinding="webHttpBinding"
            httpGetBindingConfiguration="" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="false" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>  
</configuration>

当我尝试使用http://devrtxengine.myserver/RTXService.svc/GetCountryList运行我的服务时,我最终得到以下错误:

<Fault xmlns="http://schemas.microsoft.com/ws/2005/05/envelope/none">
<Code>
<Value>Sender</Value>
<Subcode>
<Value xmlns:a="http://schemas.microsoft.com/ws/2005/05/addressing/none">a:DestinationUnreachable</Value>
</Subcode>
</Code>
<Reason>
<Text xml:lang="en-US">
The message with To 'http://devrtxengine.telemark/RTXService.svc/GetCountryList' cannot be processed at the receiver,due to an AddressFilter mismatch at the EndpointDispatcher. Check that the sender and receiver's EndpointAddresses agree.
</Text>
</Reason>
</Fault>

我怀疑我的App.config和我的Web.config之间存在某种不匹配的情况,但每次我尝试在Web.config中更改某些内容时,我的服务中断甚至比已经破坏的更多.有更多WCF经验的人有什么建议吗?

解决方法

我注意到端点地址是devrtxengine.telemark,但是你将listenUri作为devrtxengine.myserver.不确定这是否是一个错字或是否会产生影响.此外,您可以尝试将WebHttpBinding添加到行为中 – 有关示例,请参阅 Resolving Configuration Error in WCF AddressFilter Mismatch.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读