[英]WCF+ duplex + Windows Form Application (ButtonClick) Trouble
我有WCF类,现在可以做项目。 我的老师愿意编写带有流和双工的应用程序(我知道这是不可能的,但是我从这种情况中发现了后门-我发送的图片小于60KB)。
就我开始在Windows Form Application中编写GUI而言,我的代码运行良好。
通过控制台进行测试时,一切正常。 但是,当我想在GUI中使用按钮时,会出现以下异常:
mscorlib.dll中发生了类型为'System.TimeoutException'的未处理异常。其他信息:发送到net.tcp:// localhost:7756 / Przesylanie的此请求操作在配置的超时(00:00:59.9740007)内未收到答复。 分配给该操作的时间可能是较长超时的一部分。 这可能是因为该服务仍在处理该操作,或者是因为该服务无法发送回复消息。 请考虑增加操作超时(通过将通道/代理转换为IContextChannel并设置OperationTimeout属性),并确保该服务能够连接到客户端。
这里是一堆代码:
服务+ IService(由于堆栈的限制,我将其放入一个文件):
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
可以正常工作。
如您所见,我正在Client中Main函数的开头测试我的代码,效果很好。
但是,当我在Forms中使用相同的代码时,它不起作用。 编译器将我返回给References.cs
并给了我前面提到的异常。
等待任何回应!
我的回答不能解决您的例外问题; 但是,这可能会阻止您获得非常差的成绩。 WCF均支持流AND双工。
流式传输: https : //msdn.microsoft.com/zh-cn/library/ms733742(v= vs.110) .aspx
双工: https : //msdn.microsoft.com/zh-cn/library/ms731064(v= vs.110) .aspx
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.