【发布时间】:2014-10-13 07:53:28
【问题描述】:
伙计们,我在创建 SL 客户端以访问托管在 IIS7 中的 WCF 服务时遇到了一个奇怪的问题。我的服务合同如下所示:
[ServiceContract]
public interface IAuthorizationService
{
[OperationContract]
RoleMetadata GetRoleMetadata();
[OperationContract]
void CreateNewRole(Guid id, string name, string description);
[OperationContract]
void UpdateRole(Guid id, string name, string description);
[OperationContract]
void RemoveRole(Guid id);
[OperationContract]
void AddPersonsToRole(Guid roleID, IEnumerable<int> pids);
[OperationContract]
void RemovePersonsFromRole(Guid roleID, IEnumerable<int> pids);
[OperationContract]
void GrantRolePermissions(Guid roleID, Int64 mask);
[OperationContract]
void RevokeRolePermissions(Guid roleID, Int64 mask);
}
我说这个问题很奇怪,因为该服务的部分方法可以访问,而其他方法无法访问。条件是,当我尝试访问方法 GetRoleMetadata 时,我收到一个错误,显示发生了异步异常并且结果无效。但是当我调用 CreateNewRole 时,我顺利地在数据库中获得了新记录。
我已经多次检查服务和客户端配置,并在一些不同的实现中重写了服务,但我收获了无用的收获。所以希望有高手能帮我打败它。
还有一点,它在开发环境下完美运行(vs2013,sqlexpress 2008)。在服务器(Windows Server2008 R2 企业版、SQLServer 2008 企业版、IIS7、.net framework 4.0)上实施项目后出现问题。
[2014-10-16] 我用 WCF 通道模式重写了服务和相应的客户端代码。新合同是这样的:
[ServiceContract]
public interface IAuthority
{
[OperationContract(AsyncPattern = true)]
IAsyncResult BeginGetRoles(AsyncCallback callback, object state);
RoleMetaData EndGetRoles(IAsyncResult result);
[OperationContract(AsyncPattern = true)]
IAsyncResult BeginUpdateRole(bool addNewRole, Guid id, string name, string description, AsyncCallback callback, object state);
void EndUpdateRole(IAsyncResult result);
[OperationContract(AsyncPattern = true)]
IAsyncResult BeginRemoveRole(Guid id, AsyncCallback callback, object state);
void EndRemoveRole(IAsyncResult result);
[OperationContract(AsyncPattern = true)]
IAsyncResult BeginAlterRoleMembers(Guid roleID, bool addMembers, IEnumerable<int> pids, AsyncCallback callback, object state);
void EndAlterRoleMembers(IAsyncResult result);
[OperationContract(AsyncPattern = true)]
IAsyncResult BeginAlterRolePermissions(Guid roleID, bool grantPermissions, Int64 mask, AsyncCallback callback, object state);
void EndAlterRolePermissions(IAsyncResult result);
}
然后在客户端我使用 ChannelFactory 和 Channel 访问服务。但是,问题仍然存在。我可以访问除 GetRoles 之外的所有方法。这次我收到一条新的错误消息:“[HttpWebRequest_WebException_RemoteServer] NotFound”。我的心都碎了。下一步,我将重写整个 UI 和服务代理,即一个全新的客户端来测试这个问题。上帝保佑我。
[2014-10-16 23:32 成都] 我写了一个新的简单客户端来访问服务。问题仍然存在。然而,这清楚地表明服务器上的某些东西是错误的。明天我必须仔细检查服务器端的东西。 IIS 配置是第一嫌疑人?但是还有 5 个服务与这个不幸的授权服务共享相同的配置并按预期运行。
WCF 跟踪也没有向我表示应有的尊重!我在 web.config 中配置了跟踪,如下所示,只是得到了一个空文件。
<system.diagnostics>
<sources>
<source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true" >
<listeners>
<add name="xml" />
</listeners>
</source>
<source name="System.ServiceModel.MessageLogging">
<listeners>
<add name="xml" />
</listeners>
</source>
</sources>
<sharedListeners>
<add name="xml" type="System.Diagnostics.XmlWriterTraceListener" initializeData="D:\trace.xml"/>
</sharedListeners>
</system.diagnostics>
<system.serviceModel>
<diagnostics>
<messageLogging logEntireMessage="true"
logMalformedMessages="true"
logMessagesAtServiceLevel="true"
logMessagesAtTransportLevel="true"
maxMessagesToLog="500"/>
</diagnostics>
<!--...-->
</system.serviceModel>
大师们,请给我一个顿悟,救救我!
【问题讨论】:
标签: wcf silverlight asynchronous invalidation