WCF +双工+ Windows窗体应用程序(ButtonClick)麻烦

时间:2015-12-29 00:33:44

标签: c# .net wcf windows-forms-designer duplex

我有WCF课程,现在可以做项目。我的老师给了用流媒体和双工写的应用程序(我知道这是不可能的,但我发现了这种情况的后门 - 我发送60KB以下的照片)。

我开始在Windows窗体应用程序中编写GUI时,我的代码运行良好。

当我通过控制台测试时 - 一切正常。但是,当我想在我的GUI中使用按钮时,我有这个例外:

  

发生了'System.TimeoutException'类型的未处理异常   mscorlib.dll附加信息:此请求操作发送到   net.tcp:// localhost:7756 / Przesylanie没有收到回复   配置的超时(00:00:59.9740007)。分配给此的时间   操作可能是较长超时的一部分。这可能是   因为服务仍在处理操作或因为   服务无法发送回复消息。请考虑   增加操作超时(通过将通道/代理转换为   IContextChannel并设置OperationTimeout属性)并确保   该服务能够连接到客户端。

这里有一堆代码:

服务+ IService(由于Stack的限制我把它放到一个文件中):

public void WyslijstrumienNaSerwer()
    {
        IPrzesylanieCallback callback = OperationContext.Current.GetCallbackChannel<IPrzesylanieCallback>();
        string sciezka = @"E:\5 semestr\Fras\Se płotek\Lab6\WcfServiceContractZadanie2\Host\bin\Pliki\" + "plik_odebrany.jpg";
        string filePath = Path.Combine(System.Environment.SystemDirectory, sciezka);
        Console.WriteLine("start");
        callback.WyslijStrumien(filePath);
        Console.WriteLine(filePath);
        Console.WriteLine("meta");
    }

namespace WcfServiceContractZadanie2
{
    [ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IPrzesylanieCallback))]
    public interface IPrzesylanie
    {
        [OperationContract]
        void WyslijstrumienNaSerwer();
    }

    [ServiceContract]
    public interface IPrzesylanieCallback
    {
        [OperationContract(IsOneWay = true)]
        void WyslijStrumien(string filePath);
    }
}

客户端+回调+表单+ References.cs:

namespace Aplikacja
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {

            PrzesylanieClient klient = new PrzesylanieClient(new InstanceContext(new PrzesylanieCallback()), "NetTcpBinding_IPrzesylanie");

            klient.WyslijstrumienNaSerwer();

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());

        }
    }
    public class PrzesylanieCallback : Referencja1.IPrzesylanieCallback
    {
        public void WyslijStrumien(string filePath)
        {
            Form1 o1 = new Form1();

            //  Pobieranie obrazka od klienta
            string sciezka = @"E:\5 semestr\Fras\Se płotek\Lab6\WcfServiceContractZadanie2\Aplikacja\bin\Pliki\" + o1.wybrany();
            string filePathZrodla = Path.Combine(System.Environment.SystemDirectory, sciezka);

            //Otwieranie obrazka
            Stream strumien = null;
            try
            {
                FileStream imageFile = File.OpenRead(filePathZrodla);
                strumien = (Stream)imageFile;
            }
            catch(IOException ioe)
            {
                Console.WriteLine("Wyjatek otwierania pliku: {0}", ioe.ToString());
                Console.ReadKey();
                throw ioe;
            }
            //  Zapisywanie obrazka
            o1.SaveFile(strumien, filePath);
        }
    }
}

 private void btnPrzeslijPlikNaSerwer_Click(object sender, EventArgs e)
        {
               PrzesylanieClient klient = new PrzesylanieClient(new InstanceContext(new PrzesylanieCallback()), "NetTcpBinding_IPrzesylanie");
            klient.WyslijstrumienNaSerwer();
        }

public void WyslijstrumienNaSerwer() {
       base.Channel.WyslijstrumienNaSerwer();
}

我写了正确的方法SaveFile

如您所见,我正在客户端的Main函数的开头测试我的代码并且运行良好。

但是当我在Forms中使用相同的代码时,它不起作用。编译器将我返回到References.cs并给我提到我之前提到的例外情况。

等待任何反响!

1 个答案:

答案 0 :(得分:0)

我的回答并不能解决您的例外问题;但是,它可能会阻止你获得非常糟糕的成绩。 WCF支持流式 AND 双工。

流: https://msdn.microsoft.com/en-us/library/ms733742(v=vs.110).aspx

双工: https://msdn.microsoft.com/en-us/library/ms731064(v=vs.110).aspx