我有一个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上工作.现在,当我更换机器并保持连接到同一路由器时,应用程序正常工作.
我无法弄清楚这个问题.有关如何调试此问题的任何想法?
任何帮助赞赏.
我有一个localhost客户端和WCF Web服务,我正在尝试查看SOAP消息的样子,并验证是否正在使用soap + xml.
我尝试使用Fiddler,我得到像这样奇怪的东西:
<input type="submit" name="cmdGetCapabilities" value="GetCapabilities" id="cmdGetCapabilities" />
<script type="text/javascript">
LoadRequest('txtGetCapabilitiesRequest', './xml/oseopRequest_GetCapabilities.xml')</script>
<h5>
Response</h5>
<br />
<textarea name="txtGetCapabilitiesResponse" id="txtGetCapabilitiesResponse" cols="70" rows="10">Hello test response string</textarea>
|156|hiddenField|__VIEWSTATE|/wEPDwULLTE4NzQ1MTA5MDIPZBYCAgMPZBYCAgMPZBYCZg9kFgICAw8WAh4JaW5uZXJodG1sBRpIZWxsbyB0ZXN0IHJlc3BvbnNlIHN0cmluZ2RkqYOXbJ/FDnErLs5ws2ZmhyRiXwZoUdF7s5KAUS3NgVU=|72|hiddenField|__EVENTVALIDATION|/wEWAwKEj88XAoyqi+0CAoH3wsYJfbp248BhSjkeWuuXYou1JuSHEFMD2NrnszOSKQq7YZg=|0|asyncPostBackControlIDs|||0|postBackControlIDs|||26|updatePanelIDs||tUpdatePanel1,UpdatePanel1|0|childUpdatePanelIDs|||25|panelsToRefreshIDs||UpdatePanel1,UpdatePanel1|2|asyncPostBackTimeout||90|12|formAction||default.aspx|
Run Code Online (Sandbox Code Playgroud)
但是fiddler正在接收客户回帖或调用"click"事件并将数据返回给浏览器,没有会话条目显示客户端调用我的WCF svc页面.
我尝试使用TraceViewer,我可以看到我的网络方法的调用,但没有肥皂信封.
有谁知道如何查看WCF的发送和接收消息?
好吧,坚持下去,因为这里有很多层次,虽然这可能需要一点时间来阅读所有这些,但我认为我们所提出的答案对整个社区都非常有用. ,让我设置问题:
我有一个C#.Net桌面应用程序(Windows Forms,但它可以像我想的那样很容易就是WPF),这是一个销售订单输入和管理系统.我遇到的问题是,我需要在应用程序中使用的最重要的数据列表之一是相当大(大约15k记录,并且正在增长)并且正在发生变化,我想保留列表内存与数据库同步,而不是每2秒或两次轮询数据库.应用程序也不是单实例,因此所有这些列表都将应用程序需求从数据库引入内存并在每个实例中保留一次.
好了,既然你已经看到了困境,那就让我们看看我们是否能够找到解决方案.
我的想法:
如果我们能够使用.NET 4.0(我可以),我认为在内存中只保留一组数据的答案是使用内存映射文件.虽然它看起来像是一个本垒打,但它的管理要复杂得多,而且可能有些过分.思考?
为了将数据库中的数据加载保持在最低限度,我想到了将各种列表保存到用户PC上某些特殊文件夹中的XML文本文件,然后是一个最终XML文件,用于跟踪XML文件及其日期.在应用程序启动时,将执行对DB的单个调用,获取表/列表列表以及每个列表的"上次更新日期".对于具有相同上次更新日期的每个XML文件,我可以从XML文件加载,而不是查询数据库.对于过时的列表,我可以查询自我拥有的日期以来的更改,然后加载XML文件,然后提交更改.这样,我不得不等待的更多可能是更频繁更新的列表的更改,而不是所有表/列表.好吧,我承认我不是最擅长解释事情,但我认为你应该能够想象它.
至于实时保持最新状态我正在考虑插入和更新触发器(不会发生删除)然后调用SP,这就是我有点模糊的地方,以某种方式传递插入/更新的信息应用程序已订阅的WCF服务,并通过WCF回调将更新推送到客户端.现在我认为这应该都可行,但是,例如,这不会导致应用程序的3个实例同时更新内存中的相同更改吗?WCF服务是否能够将更新仅发送到每个客户端PC的一个实例; 它可以分化吗?
在此先感谢任何和所有的想法,意见和投入.我会保留至少48小时"给予"答案,因为我希望每个人都有机会投入2美分,让这个线程对未来更有用......
我明白了:
接收到http:// localhost:8732/Design_Time_Addresses/PersistencyService/Service1 /的HTTP响应时发生错误.这可能是由于服务端点绑定不使用HTTP协议.这也可能是由于服务器中止HTTP请求上下文(可能是由于服务关闭).请参阅服务器日志以获取更多详
为什么我这样做?我认为这是因为该方法需要大约1分钟才能完成.如何禁用任何时间限制?
当我在VS中运行一个在同一解决方案中使用WCF服务的Windows表单项目时,我得到了这个
我的WCF配置: 编辑:
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="LongRunning" sendTimeout="00:10:00" />
</wsHttpBinding>
</bindings>
<client>
<endpoint name="Default"
address="http://localhost:8732/Design_Time_Addresses/PersistencyService/Service1/"
binding="wsHttpBinding"
bindingConfiguration="LongRunning"
contract="PersistencyService.IService1" />
</client>
<services>
<service name="PersistencyService.Service1">
<endpoint
address=""
binding="wsHttpBinding" bindingConfiguration=""
contract="PersistencyService.IService1" >
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8732/Design_Time_Addresses/PersistencyService/Service1/" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
Run Code Online (Sandbox Code Playgroud)
异常消息是远程主机强制关闭现有连接.我还必须补充说,我从服务中获得了大约70MB的数据
我们正在构建一个启动/停止其他进程的窗口服务,UI和服务之间的通信是使用NetNamedPipe.
每个进程都有一个可以获得关闭调用的主机(仍然使用NetNamedPipe以避免端口交叉).
我在我的计算机上使用它,当我将它移动到服务器时它不起作用(NetNamedPipe不适用于跨网络 - 现在我知道).
有没有办法做到这一点?
Ye Olde添加Web引用会对使用事件的服务生成XXXAsync调用,以通知呼叫者呼叫已完成.
在WPF或控制台应用程序中添加服务引用,当被告知生成异步操作时,使用IAsyncResult设计模式(BeginXXX和EndXXX操作).我的理解是,这通常被认为是可用性和灵活性的一个进步 - 您可以使用回调,您可以通过调用EndXXX在任何时间点开始阻止,您可以对等待句柄进行分组并阻止一组操作,你可以投票等
为什么Silverlight中的ASR不使用IAsyncResult?我的猜测是因为设计人员想要非常清楚地表明事实上需要完全异步性,并且如果他们使用了IAsyncResult设计模式,那么尝试只需调用Begin然后紧跟End就太容易了.对于一个可能被大约100%的新开发者或者没有很好地掌握异步的人所击中的绊脚石.
创建服务主机后,当我使用Internet Explorer时,我无法打开"http:// myuri:8000/ServiceModelSamples/Service"页面.
Uri baseAddress = new Uri("http://myuri:8000/ServiceModelSamples/Service");
// Step 2 of the hosting procedure: Create ServiceHost
ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress);
// rest of the below code is from calculator MSDN sample
Run Code Online (Sandbox Code Playgroud)
它只有在我使用localhost而不是"myuri"时才有效.有人可以告诉你还需要什么吗?
编辑:myri实际上是我的PC名称.我也尝试在我的电脑上使用IP地址.Internet Explorer可以从我的框中打开URL,但是当我从其他框打开URL时它会失败(例如,我试图打开的URL是http://111.251.164.20:8000/ServiceModelSamples/Service)
创建WCF服务后,有没有办法在没有IIS的情况下部署它?我创建的服务只会在局域网中使用,而我宁愿让主机运行ASP.NET服务器来托管WCF服务.
我需要能够做到这一点的另一个原因是因为我将使用的其中一个DLL与ASP.NET不能很好地兼容.
我有一个WCF库项目,我从控制台应用程序引用.问题是每次我添加引用并注册它时,它会在以下所有情况下消失: