Xamarin应用ClientMessageInspectors不可用抛出未实现异常如何解决
Xamarin.Android WCF消息检查器NotImplementedException修复方案
问题根因
Xamarin.Android使用的是Mono移植的精简版System.ServiceModel类库,没有完整实现.NET Framework下WCF的全量API:
- 对外暴露的
ClientMessageInspectors属性仅做了接口存根,没有实际实现,运行时调用就会抛出System.NotImplementedException - 内部实际存在的
MessageInspectors属性被标记为internal,外部代码无法直接访问,直接替换属性名会导致编译失败
可行修复方案
方案1:反射注入消息检查器(保留WCF原生扩展逻辑)
如果确实需要通过WCF消息检查器修改SOAP信封内容,可以通过反射获取内部的MessageInspectors属性完成注入,不需要调用未实现的ClientMessageInspectors:
- 先实现自定义消息检查器逻辑:
public class CustomHeaderInspector : IClientMessageInspector { public object BeforeSendRequest(ref Message request, IClientChannel channel) { // 在这里补充自定义SOAP头/请求处理逻辑 if (request.Headers.FindHeader("AppVersion", "http://your-service-namespace") < 0) { request.Headers.Add(MessageHeader.CreateHeader("AppVersion", "http://your-service-namespace", "1.0.0")); } return null; } public void AfterReceiveReply(ref Message reply, object correlationState) { // 响应处理逻辑,无需求可留空 } }
- 通过反射获取内部检查器集合,注入自定义实现:
// 初始化WCF客户端 var client = new YourSoapServiceClient(); // 反射获取ClientRuntime内部的MessageInspectors属性 var clientRuntime = client.Endpoint.Contract.Operations[0].Parent.ClientRuntime; var inspectorProp = typeof(ClientRuntime).GetProperty("MessageInspectors", BindingFlags.Instance | BindingFlags.NonPublic); var inspectors = (SynchronizedCollection<IClientMessageInspector>)inspectorProp.GetValue(clientRuntime); // 添加自定义检查器 inspectors.Add(new CustomHeaderInspector());
方案2:HTTP层面添加请求头(推荐,无兼容问题)
如果只是需要给请求补充HTTP头,不需要修改SOAP信封结构,完全可以绕开WCF未实现的消息检查器API,直接在HTTP传输层添加头,稳定性更高:
// 初始化绑定,根据自己服务的安全配置调整 var binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport); // 自定义HttpClient,统一添加请求头 var httpHandler = new HttpClientHandler(); var httpClient = new HttpClient(httpHandler); httpClient.DefaultRequestHeaders.Add("AuthToken", "your-token-value"); httpClient.DefaultRequestHeaders.Add("AppVersion", "1.0.0"); // 初始化客户端 var endpoint = new EndpointAddress("https://your-service-address/soap"); var client = new YourSoapServiceClient(binding, endpoint); // 绑定自定义HTTP传输栈 client.Endpoint.EndpointBehaviors.Add(new WebHttpBehavior());
这种方式完全不依赖Mono WCF未实现的扩展点,所有Xamarin.Android版本都能正常运行。
内容的提问来源于stack exchange,提问作者paddle.code
相关产品推荐
相关产品推荐

