在更新我的WCF客户端的服务引用时(只需单击Visual Studio 2008中的" 更新服务引用"),会发生以下错误:
System.ServiceModel.FaultException:由于EndpointDispatcher上的ContractFilter不匹配,无法在接收方处理具有Action" http://schemas.xmlsoap.org/ws/2004/09/transfer/Get " 的消息.这可能是由于合同不匹配(发送方与接收方之间的操作不匹配)或发送方与接收方之间的绑定/安全性不匹配.检查发送方和接收方是否具有相同的合同和相同的绑定(包括安全要求,例如消息,传输,无).在System.ServiceModel.Dispatcher.ErrorBehavior.ThrowAndCatch(例外e,消息消息)
背景:
我创造了ErrorServiceBehaviour课程.由于为错误处理创建了此类行为,因此IErrorHandler必须对每个行为应用实现ChannelDispatcher.
public class ErrorServiceBehaviour : Attribute, IServiceBehavior
{
...
public Type FaultType
{
get { return _faultType; }
set { _faultType = value; }
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
foreach (ChannelDispatcher dispatcher in serviceHostBase.ChannelDispatchers)
{
dispatcher.ErrorHandlers.Add(new ErrorHandler(_faultType));
}
}
}
public class ErrorHandler : IErrorHandler
{
public ErrorHandler(Type faultType)
{
_faultType = faultType;
}
...
}
Run Code Online (Sandbox Code Playgroud)
后来,我通过将ErrorServiceBehavior属性应用于我的服务类来使用该行为:
[ErrorServiceBehavior(FaultType = …Run Code Online (Sandbox Code Playgroud) 我从Windows Server 2003上的IIS 6移动.
我可以浏览.svc文件.如果我在浏览器中访问http://example.com/Service.svc,我会得到一个很好的标准"这是一个Windows©Communication Foundation服务"页面.
但我无法浏览任何方法 - 如果我在浏览器中访问http://example.com/Service.svc/Method?parameter=xyz,我会收到404错误.
有没有人见过这样的东西?任何想法或建议?
我想我可能会遇到类似的问题:IIS8上的WCF;*.svc处理程序映射不起作用
但症状是不同的(看起来他们根本看不到.svc文件)并且没有解决方案工作(我已经安装了WCF功能的Http Activation等).
我最近阅读了Chris Love关于使用WCF跟踪来帮助进行故障排除的建议.
他通过在app.config文件中添加新的XML部分来启用跟踪,此后我在相同的技术中看到了类似的建议.
但是我们真的不想发送多个app.config文件.
我们绝对不希望客户在生产系统上修改它们!
有没有办法可以在app.config中设置WCF跟踪的各种设置,但是从代码打开/关闭跟踪?
理想情况下,我希望我的应用程序检查注册表,并仅在存在特定值时激活跟踪.
我一直在将一个相当大的系统从Remoting转换为WCF,一切似乎运行良好,除了我们经常得到以下异常:"System.InvalidOperationException:Collection被修改;枚举操作可能无法执行." 我没有任何运气跟踪它,因为它只发生在有数百个调用通过时,我只能假设它是因为一个对象被修改,因为它被序列化.
所有类都使用:[DataContract(IsReference=true)].
在使用远程处理时没有类似的例外,所以我想知道是否有人在WCF中遇到过类似的问题,或者可以让我知道它可能是序列化程序 - 在这种情况下我假设我必须编写自己的序列化程序来执行locks必要时(这是一项我宁愿避免的大事).
以下是堆栈跟踪:
WCF Error: at System.Collections.Generic.List1.Enumerator.MoveNextRare()
at WriteArrayOfLineToXml(XmlWriterDelegator , Object , XmlObjectSerializerWriteContext , CollectionDataContract )
at System.Runtime.Serialization.CollectionDataContract.WriteXmlValue(XmlWriterDelegator xmlWriter, Object obj, XmlObjectSerializerWriteContext context)
at System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerialize(XmlWriterDelegator xmlWriter, Object obj, Boolean isDeclaredType, Boolean writeXsiType, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle)
at System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerializeReference(XmlWriterDelegator xmlWriter, Object obj, Boolean isDeclaredType, Boolean writeXsiType, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle)
at WriteLineGroupToXml(XmlWriterDelegator , Object , XmlObjectSerializerWriteContext , ClassDataContract )
at System.Runtime.Serialization.ClassDataContract.WriteXmlValue(XmlWriterDelegator xmlWriter, Object obj, XmlObjectSerializerWriteContext context)
at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithoutXsiType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, …
以下WCF端点与WCF测试客户端一起正常工作:
[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Xml,
BodyStyle = WebMessageBodyStyle.Bare,
UriTemplate = "listflaggedassets/{platform}?endpoint={endpoint}&pid={portalid}&processCode={processCode}&index={index}&limit={limit}")]
AssetList ListFlaggedAssets(short processCode, string platform, string endpoint = "null", string portalId = "null", int index = 0, int limit = 12);
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试导航到URL时,http://localhost/DigitalREST/XosAssets.svc/listflaggedassets/SEC?endpoint=superfan&pid=0&processCode=0&index=0&limit=20我收到400错误请求.
我似乎无法找到任何方法来弄清楚为什么我收到一个错误的请求,并附加到IIS进行调试不会中断任何异常.
如何调查错误请求的原因?
我有一个SOA应用程序,它使用Windows服务中托管的双工WCF服务.客户端本身是WPF应用程序.
我在关闭和重新启动客户端应用程序时看到异常行为.如果我在关闭一个实例后开始一个新实例,那么看起来就不会发生任何事情.但是,检查任务管理器会显示新实例正在作为后台进程运行.如果我尝试启动客户端应用程序的另一个新实例,它将显示我写的错误屏幕 - 说明服务的错误.调查显示客户端无法创建服务回调通道的新实例,因为另一个应用程序已经注册了URL.这是一个System.ServiceModel.AddressAlreadyInUseException.
如果我然后在任务管理器中结束后台客户端任务,则显示错误消息的客户端可以连接到服务并正常运行.我还注意到,如果在启动新实例之前关闭后台任务,则新实例也不会出现.
我担心的是,这是不可用的,对用户来说感觉真的很麻烦.怎么可能出错?似乎有些事情没有清理非托管资源但是我使用了ANTS并且无法识别它.客户端创建为:
IServiceCallback callback = new Callback();
_context = new InstanceContext(callback);
_channelFactory = new DuplexChannelFactory<IMyService>(_context, binding, endpoint);
_proxy =
_channelFactory.CreateChannel();
((ICommunicationObject)_proxy).Open(TimeSpan.FromSeconds(5));
Run Code Online (Sandbox Code Playgroud)
Service的构造函数使用以下代码:
_callback = OperationContext.Current.GetCallbackChannel<IServiceCallback>();
var commObject = _callback as ICommunicationObject;
if (commObject != null)
{
commObject.Faulted += ChannelFaulted;
commObject.Closing += ChannelClosing;
commObject.Closed += ChannelClosed;
}
OperationContext.Current.Channel.Faulted += ChannelFaulted;
OperationContext.Current.Channel.Closed += ChannelFaulted;
Run Code Online (Sandbox Code Playgroud)
在关闭之前,客户端调用服务的Disconnect方法,该方法执行以下操作:
var commObject = _callback as ICommunicationObject;
if (commObject != null)
{
commObject.Faulted -= ChannelFaulted;
commObject.Closing -= ChannelClosing;
commObject.Closed -= ChannelClosed;
}
OperationContext.Current.Channel.Faulted -= …Run Code Online (Sandbox Code Playgroud) 当我尝试从webservice加载方法时,我收到一个错误:
"由于内部错误,服务器无法处理请求.有关错误的更多信息,请在服务器上启用IncludeExceptionDetailInFaults(来自ServiceBehaviorAttribute或配置行为),以便将异常信息发送回客户端,或根据Microsoft .NET Framework SDK文档打开跟踪并检查服务器跟踪日志"
这是我的app.config端点def:
<services>
<service name="Service" behaviorConfiguration="debug">
</services>
<client>
<endpoint name="Service" address="net.tcp://localhost:12708/" binding="netTcpBinding" bindingConfiguration="netTcp" contract="path.IService" >
<identity>
<servicePrincipalName />
</identity>
</endpoint>
</client>
<serviceBehaviors>
<behavior name="debug">
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
Run Code Online (Sandbox Code Playgroud)
如果我声明了serviceBehaviors,我看不到更多信息事件.有人可以告诉我如何才能看到有关此错误的更多详细信息?
是否可以从我的WCF服务中记录ThrowMaxReceivedMessageSizeExceeded等异常.我知道可以在配置中增加消息大小,但我也希望它能在我这边登录.我运行Log4Net以捕获所有未处理的异常,但似乎没有记录,所以可能会处理.
我在Web服务中调用方法时遇到以下错误,而不是由我开发.
mscorlib.dll中发生了未处理的"System.ServiceModel.CommunicationException"类型异常
它不仅发生在我的本地开发机器上,而且发生在部署软件时也发生在客户端的服务器上.
我目前正在使用Visual Studio 2010.
我有一个WCF服务和两个控制台应用程序客户端.
服务:使用WCSF Blue工具从wsdl联系人创建服务代码.
客户端1:此客户端使用通过浏览svc文件获得的wsdl.此浏览的wsdl文件与合同wsdl文件略有不同.
客户端2:此客户端使用原始wsdl合同创建.
Cleint1工作正常.客户端2无法正常工作.什么都可能是潜在的问题?
两个客户端的App.Config文件看起来相似 - 只有名称更改.我认为,问题将在客户端生成C#代码 - 最有可能在Action - ReplyAction中.这里有什么需要纠正的?
一个明显的区别在于Action和ReplyAction
客户1:
Action ="urn:lijo:demos:multiplyservice:calculation:v1/ICalculationService/GetMultiplied",ReplyAction ="urn:lijo:demos:multiplyservice:calculation:v1/ICalculationService/GetMultipliedRe"+"sponse"
客户2:
Action ="urn:lijo:demos:multiplyservice:calculation:v1:getMultipliedIn",ReplyAction ="*"
跟踪消息
由于EndpointDispatcher上的ContractFilter不匹配,因此无法在接收方处理具有Action'urn:lijo:demos:multiplyservice:calculation:v1:getMultipliedIn'的消息.这可能是由于合同不匹配(发送方与接收方之间的操作不匹配)或发送方与接收方之间的绑定/安全性不匹配.检查发送方和接收方是否具有相同的合同和相同的绑定(包括安全要求,例如消息,传输,无).
编辑
这可以通过更改Action和ReplyAction来更正,如下所示(从服务中复制).
[System.ServiceModel.OperationContractAttribute(Action = "urn:lijo:demos:multiplyservice:calculation:v1/ICalculationService/getMultiplied", ReplyAction = "urn:lijo:demos:multiplyservice:calculation:v1/ICalculationService/getMultipliedRe" +
"sponse")]
Run Code Online (Sandbox Code Playgroud)
注意:确保服务中的外壳正确是很重要的(即getMultiplied不是GetMultiplied)
从服务中复制不是一个好的选择,尽管它有效.什么是正确的Action和ReplyAction?
另外,您能否指出如何修改wsdl以使ReplyAction在生成的客户端代理中正确?这是将其标记为已回答的重要部分.
用于元数据发布的WsdlExporter忽略使用星号操作(Action和ReplyAction)的操作.
在服务中指定星号指示WCF不向消息添加回复操作,如果您直接对消息进行编程,这将非常有用.
参考文献:
RestaurantData.xsd
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema id="RestaurantData" targetNamespace="urn:lijo:demos:multiplyservice:data:v1"
elementFormDefault="qualified" xmlns="urn:lijo:demos:multiplyservice:data:v1"
xmlns:mstns="urn:lijo:demos:multiplyservice:data:v1" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="multipliedResult">
<xs:sequence>
<xs:element name="resultNumber" type="xs:int" />
</xs:sequence>
</xs:complexType>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)
原始合同wsdl
<definitions xmlns:import0="urn:lijo:demos:multiplyservice:messages:v1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:import1="urn:lijo:demos:multiplyservice:data:v1" xmlns:tns="urn:lijo:demos:multiplyservice:calculation:v1" …Run Code Online (Sandbox Code Playgroud) 我在我的Windows应用程序中托管了WCF Restful服务.
该服务的客户端是移动应用程序.
客户端调用服务并将消息传递给应用程序并执行工作.
我面临的问题是应用程序在大多数情况下都能正常工作.但它在某些机器和网络设置上不起作用.
为了给出一个更好的主意:该应用程序不能在连接到路由器A的机器1上工作.现在当我更改并将其连接到路由器B时,同一个应用程序开始在同一台机器上运行.
同样,应用程序不能在连接到路由器A的machine1上工作.现在,当我更换机器并保持连接到同一路由器时,应用程序正常工作.
我无法弄清楚这个问题.有关如何调试此问题的任何想法?
任何帮助赞赏.
我已经构建了一个Windows窗体客户端应用程序,它可以进行WCF调用.我希望能够在应用程序中显示实际的请求和响应,包括SOAP标头以及有关POST/Get的信息.有没有办法在客户端上配置跟踪侦听器并从客户端中使用它,在文本框中显示内容?
我已经配置了将消息输出到文件的跟踪.此配置在我的客户端应用程序上,因此它记录了它对wcf服务和响应所做的所有调用.因此添加了源代码,每个源代码都是一个XmlTraceListener,它处理写入xml日志文件.我现在要做的是利用客户端应用程序本身内的跟踪侦听器并写入文本框控件.
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="All">
<listeners>
<add name="xmlTraceListener" />
</listeners>
</source>
<source name="System.ServiceModel.MessageLogging"
switchValue="All">
<listeners>
<add name="xmlTraceListener" />
</listeners>
</source>
</sources>
<sharedListeners>
<add name="xmlTraceListener"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="ClientLogBasic.svclog" />
</sharedListeners>
<trace autoflush="true" />
</system.diagnostics>
<!-- child of the <system.serviceModel> element -->
<diagnostics>
<messageLogging maxMessagesToLog="10000"
logEntireMessage="true"
logMessagesAtServiceLevel="true"
logMalformedMessages="true"
logMessagesAtTransportLevel="true">
<filters>
<clear/>
</filters>
</messageLogging>
</diagnostics>
Run Code Online (Sandbox Code Playgroud)
现在,我已经有消息日志记录工作,我创建了自己的跟踪侦听器,可以写入文本框:
public class MyTraceListender : System.Diagnostics.TraceListener
{
private TextBox txt_m;
public MyTraceListender(TextBox txt)
: base()
{
txt_m = txt;
}
private delegate void delWrite(string sText);
public override …Run Code Online (Sandbox Code Playgroud)