Xamarin.Android问题

时间:2018-01-24 16:34:33

标签: android wcf xamarin soap

我正在尝试使用连接到Dynamics 365财务和操作自定义Web服务的Xamarin应用程序(使用PCL方法的Xam.And.SDK 8.0.2.1进行Xam 4.7.10.38)。 总而言之,它是一个WCF Soap服务,它使用Azure Active Directory客户端ID +客户端密钥连接到soap服务。

我已将以下代码中最重要的部分发布,以供参考。

按照说明,我使用Silverlight SDK创建服务引用代理类,并添加了必要的框架引用。 然后我在我的Android项目中以及使用VS.Net 2017的标准.Net Windows应用程序中包含了这个代理类。

在我致电var resultAsync = service.BeginValidateUser(validateUserRequest, null, null);

之前,一切都是一致的

在我的Windows应用中,它会返回

  

System.ServiceModel.Channels.ServiceChannel.SendAsyncResult。

我做WaitOne来结束它,我的EndValidateUser返回正确的结果。

但是在我的Android应用中,它会返回

  

System.Runtime.Remoting.Messaging.AsyncResult

是具有不同成员/方法的不同对象。 Waitone仍然有效,但是当我调用EndValidateUser时,我得到一个例外

  

“System.ArgumentOutOfRangeException:指定的参数不在   有效值范围。\ n参数名称:值\ n at(包装器   托管到本机)   System.Object的:__ icall_wrapper_mono_delegate_end_invoke   (object,intptr)\ n at(wrapper delegate-end-invoke)   :end_invoke_object__this ___对象[]&安培; _IAsyncResult   (object []&,System.IAsyncResult)\ n at   System.ServiceModel.MonoInternal.ClientRuntimeChannel.EndProcess   (System.Reflection.MethodBase方法,System.String operationName,   System.Object []参数,System.IAsyncResult结果)[0x0001f] in   < 475dec2c1fe44b95bbfbd21b550b63f8>:0 \ n at at   System.ServiceModel.ClientBase 1+ChannelBase 1 [TChannel,T] .EndInvoke   (System.String methodName,System.Object [] args,System.IAsyncResult   结果)[0x00045]在< 475dec2c1fe44b95bbfbd21b550b63f8>中:0 \ n

关于如何解决这个问题的任何想法或方法?

此致 Sven Peeters

参考代码:

    AuthenticationContext authenticationContext = new AuthenticationContext(Static_Functions.activeDirectoryTenant);

        string aadClientAppSecret = Static_Functions.activeDirectoryClientAppSecret;
        ClientCredential creadential = new ClientCredential(Static_Functions.activeDirectoryClientAppId, aadClientAppSecret);
        AuthenticationResult authenticationResult = authenticationContext.AcquireTokenAsync(Static_Functions.activeDirectoryResource, creadential).Result;
        string oAuthHeader = authenticationResult.CreateAuthorizationHeader();

        string serviceName = "PWBMobilityServiceGroup";
        string soapServiceUriString = Static_Functions.GetSoapServiceUriString(serviceName, Static_Functions.aosUri);

        EndpointAddress endpointAddress = new EndpointAddress(soapServiceUriString);
        System.ServiceModel.Channels.Binding binding = Static_Functions.GetBinding();

        SchindlerTechAssist.Droid.D365Service.MobilityServiceClient client = new SchindlerTechAssist.Droid.D365Service.MobilityServiceClient(binding, endpointAddress);
        IClientChannel dimServiceChannel = client.InnerChannel;

        using (OperationContextScope dimServiceOperContext = new OperationContextScope(dimServiceChannel))
        {
            HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
            requestMessage.Headers[Static_Functions.OAuthHeader] = oAuthHeader;
            OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;

            CallContext callContext = new CallContext { Company = "DAT" };

            string empId = "000509";
            string pass = "test";

            #region Validate User

            SchindlerTechAssist.Droid.D365Service.PWBMobServiceValidateUserRequest validateUserRequest = new SchindlerTechAssist.Droid.D365Service.PWBMobServiceValidateUserRequest();
            validateUserRequest.EmployeeId = empId;
            validateUserRequest.Password = pass;

            SchindlerTechAssist.Droid.D365Service.MobilityService service = (SchindlerTechAssist.Droid.D365Service.MobilityService)dimServiceChannel;

            var resultAsync = service.BeginValidateUser(validateUserRequest, null, null);
            resultAsync.AsyncWaitHandle.WaitOne();

            var result = service.EndValidateUser(resultAsync);


            #endregion

        }

1 个答案:

答案 0 :(得分:0)

我的修复是在Android属性中启用TLS 1.2。动态测试/生产环境需要来自客户端的TLS 1.2。