我有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
并给我提到我之前提到的例外情况。
等待任何反响!
答案 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