Could anyone communicate using WCF on a Windows Phone Series 7 emulator?
I have been trying for the past two days, and it just happens to me. I can get a regular Silverlight control to work in both Silverlight 3 and Silverlight 4, but not in the phone version. Here are two versions I tried:
Version 1 - Using Async Pattern
BasicHttpBinding basicHttpBinding = new BasicHttpBinding(); EndpointAddress endpointAddress = new EndpointAddress("http://localhost/wcf/Authentication.svc"); Wcf.IAuthentication auth1 = new ChannelFactory<Wcf.IAuthentication>(basicHttpBinding, endpointAddress).CreateChannel(endpointAddress); AsyncCallback callback = (result) => { Action<string> write = (str) => { this.Dispatcher.BeginInvoke(delegate { //Display something }); }; try { Wcf.IAuthentication auth = result.AsyncState as Wcf.IAuthentication; Wcf.AuthenticationResponse response = auth.EndLogin(result); write(response.Success.ToString()); } catch (Exception ex) { write(ex.Message); System.Diagnostics.Debug.WriteLine(ex.Message); } }; auth1.BeginLogin("user0", "test0", callback, auth1);
This version is broken into this line:
Wcf.IAuthentication auth1 = new ChannelFactory<Wcf.IAuthentication>(basicHttpBinding, endpointAddress).CreateChannel(endpointAddress);
Throw System.NotSupportedException . The exception is not very descriptive, and the stop table is also not very useful:
at System.ServiceModel.DiagnosticUtility.ExceptionUtility.BuildMessage (Exception x)
at System.ServiceModel.DiagnosticUtility.ExceptionUtility.LogException (Exception x)
at System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError (Exception e)
at System.ServiceModel.ChannelFactory`1.CreateChannel (EndpointAddress address)
at WindowsPhoneApplication2.MainPage.DoLogin ()
....
Version 2 - WCF Call Block
Here is a version that does not use the async template.
[System.ServiceModel.ServiceContract] public interface IAuthentication { [System.ServiceModel.OperationContract] AuthenticationResponse Login(string user, string password); } public class WcfClientBase<TChannel> : System.ServiceModel.ClientBase<TChannel> where TChannel : class { public WcfClientBase(string name, bool streaming) : base(GetBinding(streaming), GetEndpoint(name)) { ClientCredentials.UserName.UserName = WcfConfig.UserName; ClientCredentials.UserName.Password = WcfConfig.Password; } public WcfClientBase(string name) : this(name, false) {} private static System.ServiceModel.Channels.Binding GetBinding(bool streaming) { System.ServiceModel.BasicHttpBinding binding = new System.ServiceModel.BasicHttpBinding(); binding.MaxReceivedMessageSize = 1073741824; if(streaming) { //binding.TransferMode = System.ServiceModel.TransferMode.Streamed; } /*if(XXXURLXXX.StartsWith("https")) { binding.Security.Mode = BasicHttpSecurityMode.Transport; binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None; }*/ return binding; } private static System.ServiceModel.EndpointAddress GetEndpoint(string name) { return new System.ServiceModel.EndpointAddress(WcfConfig.Endpoint + name + ".svc"); } protected override TChannel CreateChannel() { throw new System.NotImplementedException(); } } auth.Login("test0", "password0");
This version crashes in the System.ServiceModel.ClientBase<TChannel> constructor. The call stack is slightly different:
at System.Reflection.MethodInfo.get_ReturnParameter ()
at System.ServiceModel.Description.ServiceReflector.HasNoDisposableParameters (MethodInfo methodInfo)
at System.ServiceModel.Description.TypeLoader.CreateOperationDescription (ContractDescription contractDescription, MethodInfo methodInfo, MessageDirection direction, ContractReflectionInfo reflectionInfo, ContractDescription declaringContract)
at System.ServiceModel.Description.TypeLoader.CreateOperationDescriptions (ContractDescription contractDescription, ContractReflectionInfo reflectionInfo, Type contractToGetMethodsFrom, ContractDescription declaringContract, MessageDirection direction)
at System.ServiceModel.Description.TypeLoader.CreateContractDescription (ServiceContractAttribute contractAttr, Type contractType, Type serviceType, ContractReflectionInfo & reflectionInfo, Object serviceImplementation)
at System.ServiceModel.Description.TypeLoader.LoadContractDescriptionHelper (Type contractType, Type serviceType, Object serviceImplementation)
at System.ServiceModel.Description.TypeLoader.LoadContractDescription (Type contractType)
at System.ServiceModel.ChannelFactory 1.CreateDescription() at System.ServiceModel.ChannelFactory.InitializeEndpoint(Binding binding, EndpointAddress address) at System.ServiceModel.ChannelFactory 1.CreateDescription() at System.ServiceModel.ChannelFactory.InitializeEndpoint(Binding binding, EndpointAddress address) at System.ServiceModel.ChannelFactory 1.CreateDescription() at System.ServiceModel.ChannelFactory.InitializeEndpoint(Binding binding, EndpointAddress address) at System.ServiceModel.ChannelFactory 1..ctor (Binding binding, EndpointAddress remoteAddress)
at System.ServiceModel.ClientBase 1..ctor(Binding binding, EndpointAddress remoteAddress) at Wcf.WcfClientBase 1..ctor(Binding binding, EndpointAddress remoteAddress) at Wcf.WcfClientBase 1..ctor(Binding binding, EndpointAddress remoteAddress) at Wcf.WcfClientBase 1..ctor (String name, Boolean streaming)
at Wcf.WcfClientBase`1..ctor (String name)
at Wcf.AuthenticationClient..ctor ()
at WindowsPhoneApplication2.MainPage.DoLogin ()
...
sub>
Any ideas?