Hi All,
In my Wcf Service My Service Contract is defined as follows:
My service is defined below and uses a background worker object. My worker_runWorkerCompleted is hit and e.Result contains the data I want to pass back up the chain.Code:namespace RatabaseWCFService { [ServiceContract(CallbackContract=typeof(IRatabaseXmlReturn), SessionMode = SessionMode.Required)] public interface IRatabaseService { [OperationContract(IsOneWay = false)] [FaultContract(typeof(ApplicationException))] void Rates(string data); } public interface IRatabaseXmlReturn { [OperationContract(IsOneWay = true)] void OnRatabaseCallback(string XmlReturn); } }
The code that uses the service is as follows:Code:[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] public class RatabaseService : IRatabaseService { BackgroundWorker worker; private String xmlData; private String xmlReturn; IRatabaseXmlReturn callback; void IRatabaseService.Rates(string data) { // xmlData = data; StreamReader reader = File.OpenText("c:\\RatabaseService\\XmlTemplates\\FrozenFoods.xml"); xmlData = reader.ReadToEnd(); reader.Close(); worker = new BackgroundWorker(); worker.DoWork += new DoWorkEventHandler(worker_DoWork); worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); worker.RunWorkerAsync(); callback = OperationContext.Current.GetCallbackChannel<IRatabaseXmlReturn>(); } void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { callback.OnRatabaseCallback(e.Result.ToString()); } protected void worker_DoWork(object sender, DoWorkEventArgs e) {....
in my client code it calls the rates method and then gets to the waitForResponse.WaitOne() but never comes back into the OnRatabaseCallback event. my endpoint bindings are declared as wsDualHttpbinding in the app.config file. can anybody see the problem?Code:public class GRIDRatabaseService : IGRIDRatabaseService, IRatabaseServiceCallback { private static AutoResetEvent waitForResponse; public FrozenFoodsSectionRating GetFrozenFoodsSectionRate() { try { waitForResponse = new AutoResetEvent(false); InstanceContext callbackContext = new InstanceContext(new GRIDRatabaseService()); using (RatabaseService.RatabaseServiceClient RateService = new RatabaseServiceClient(callbackContext)) { RateService.Open(); RateService.Rates("myXMLDataSource"); waitForResponse.WaitOne(); RateService.Close(); } } catch (FaultException<ApplicationException> e) //this will be raised by the service if there's an error in the rating engine { throw e.Detail; } return new FrozenFoodsSectionRating(); } public void OnRatabaseCallback(string XmlReturn) { waitForResponse.Set(); throw new NotImplementedException(); }


Reply With Quote