我有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}®ionID={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.