我有一个使用这些设置公开的C#WCF服务(为了保护隐私而更改了一些数据):
<system.serviceModel>
<services>
<service name="TrackingService">
<host>
<baseAddresses>
<add baseAddress="http://201.223.147.32:9245/TrackingService"/>
</baseAddresses>
</host>
<endpoint address="" binding="basicHttpBinding" contract="ITrackingService" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name ="SecuredBasic">
<security mode = "Message"/>
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True" />
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
我正在使用以下合同:
[ServiceContract, XmlSerializerFormat]
public interface ITrackingService
{
[OperationContract]
EquipmentInfo[] GetEqpCollection(string login, string password);
}
当然,EquipmentInfo结构使用[DataContract]属性进行修饰。
当我从WCF客户端调用此方法时,客户端只挂在上面的最后一行:
var wcfConn = new TrackingService();
EquipmentInfo[] eqpArray = wcfConn.GetEqpCollection("tr", "service");
我很确定这项服务正在运行,因为其他方法正在运作。只有两种不起作用的方法是返回值的方法。 你能帮我理解为什么客户在拨打服务时会冻结吗?
谢谢!
ITrackingService的实施:
public EquipmentInfo[] GetEqpCollection(string login, string password)
{
var eqpList = new List<EquipmentInfo>();
var eqpCol = EqpDataCollection.Instance.GetCopy();
foreach (DataRow eqp in eqpCol.Rows)
{
var rowEqp = new EquipmentInfo();
rowEqp.HostID = (string)eqp["HostID"];
eqpList.Add(rowEqp);
}
return eqpList.ToArray();
}
EDIT2:
public DataTable GetCopy()
{
lock (_objSync)
{
return Copy();
}
}
答案 0 :(得分:2)
通过在服务器上启用跟踪来检查日志。
答案 1 :(得分:1)
EquipmentInfo[]
有多大?对于WCF的默认设置,repsonse可能太大,这会导致服务器无法序列化并发送消息。在这种情况下,客户端会挂起并等待响应,直到达到超时。
尝试使用maxBufferPoolSize,maxBufferSize和maxReceivedMessageSize属性增加元素中的消息大小。详细信息如下:http://msdn.microsoft.com/en-us/library/ms731361.aspx
答案 2 :(得分:0)
我会说客户端等待/ freeeze,只要GetEqpCollection()服务调用没有返回。
我先检查2件事,如果你只是返回一个空列表会发生什么。只是为了看客户服务沟通工作。
public EquipmentInfo[] GetEqpCollection(string login, string password)
{
return new List<EquipmentInfo>();
}
第二个我会用测试项目检查服务器端的GetEqpCollection()。只是为了确保它有效。