WCF+双工+Windows窗体应用程序(按钮单击)故障

本文关键字:按钮 单击 故障 应用程序 双工 +Windows 窗体 WCF+ | 更新日期: 2023-09-27 18:28:15

我有WCF类,现在要做项目。我的老师给出了用流媒体和双工编写应用程序的建议(我知道这是不可能的,但我从这种情况中找到了后门-我发送的图片小于60KB)。

到目前为止,我的代码运行良好,因为我开始在Windows窗体应用程序中编写GUI。

当我通过控制台测试它时,一切都很好。但是,当我想在GUI中使用按钮时,我有一个例外:

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

这里的代码束:

Service+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);
    }
}

客户端+回调+表单+引用.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

正如你所看到的,我在Client中的Main函数的开头测试我的代码,这很好。

但当我在Forms中使用相同的代码时,它就不起作用了。编译器将我返回到References.cs,并给我前面提到的异常。

等待任何回应!

WCF+双工+Windows窗体应用程序(按钮单击)故障

我的回答不能解决您的异常问题;然而,这可能会阻止你取得非常糟糕的成绩。WCF中同时支持流式传输和双向传输。

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

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