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中同时支持流式传输和双向传输。
流媒体:https://msdn.microsoft.com/en-us/library/ms733742(v=vs.110).aspx
双面打印:https://msdn.microsoft.com/en-us/library/ms731064(v=vs.110).aspx