2013-12-15 8 views
0

나는 WCF로 시작하고 있습니다. 문제없이 작동하는 두 가지 콘솔 앱 (서버 및 클라이언트)을 만들었지 만 양식으로 이동 한 이후 모든 종류의 문제가 발생했습니다. 나는 여기저기서 다른 곳에서 그물을 보았고, 나는 내 문제로 나를 도울 수있는 것을 찾을 수 없을 것 같다. 솔직히이 문제를 이해할 수는 없지만 데이터 유형 (다른 네임 스페이스 아래에 있음)과 관련이있을 수 있다고 생각합니다. (필자는 ServiceHost를를 열고있어 위치로 점) 내가 잡있어 오류가 여기에channeldispatcher가 ichannellistener를 열 수 없습니다.

[ServiceContract] 
public interface IModelData 
{ 
    [OperationContract] 
    ArrayList GetData(); 
} 

[ServiceBehavior(UseSynchronizationContext = false)] 
public class ModelDataClient 
{ 
    ChannelFactory<IModelData> HttpFactory; 
    IModelData HttpProxy; 

    public ModelDataClient() 
    { 
     HttpFactory = new ChannelFactory<IModelData>(
      new BasicHttpBinding(), 
      new EndpointAddress("http://localhost:8000/ModelData")); 

     HttpProxy = HttpFactory.CreateChannel(); 
    } 

    public ArrayList GetData() 
    { 
     return HttpProxy.GetData(); 
    } 
} 

것 :

public partial class Form1 : Form 
{ 
    ModelDataServer Server; 
    public ScraperForm() 
    { 
     InitializeComponent(); 

     Server = new ModelDataServer(); // Opened Here 
     Server.Scraper = this; 
    } 
} 

[ServiceContract] 
public interface IModelData 
{ 
    [OperationContract] 
    ArrayList GetData(); 
} 

[ServiceBehavior(UseSynchronizationContext=false)] 
public class ModelDataServer : IModelData 
{ 
    ServiceHost Host; 
    public DataModel Model { private get; set; } 

    public ModelDataServer() 
    { 
     Host = new ServiceHost(typeof (ModelDataServer), 
      new Uri[] 
      { 
       new Uri("http://localhost:8000") 
      }); 

     Host.AddServiceEndpoint(typeof(IModelData), 
      new BasicHttpBinding(), 
      "ModelData"); 

     Host.Open(); // Error Points Here!!! 
    } 

    public ArrayList GetData() 
    { 
     return Model.GetData(); 
    } 

    public void CloseServer() 
    { 
     Host.Close(); 
    } 
} 

가 여기 내 클라이언트 코드입니다 :

여기 내 서버 코드입니다

The ChannelDispatcher at 'http://localhost:8000/ModelData' with contract(s) '"IModelData"' is unable to open its IChannelListener. 

추신 대리인이 튜토리얼에서 수행 한 작업 이외의 작업을 수행하는 데 어려움을 겪고 있습니다. 누구든지 내 양식 클래스를 다른 클래스에 전달하는 대신 위임자를 사용하는 더 나은 방법을 제안 할 수 있다면 좋습니다.

답변

0

네, 네임 스페이스 문제와 관련이 있습니다. 예를 들어 서버 프로젝트의 네임 스페이스가 ServerApp이고 클라이언트의 네임 스페이스가 ClientApp이라고 가정 해 보겠습니다. 두 응용 프로그램에서 IModelData을 정의하면 ServerApp.IModelDataClientApp.IModelData이라는 의미입니다. 코드는 동일하지만 두 인터페이스가 분리되어 있습니다 (네임 스페이스 때문에).

따라서 서비스에 ClientApp.IModelData을 전달하려고하고 있으며, ServerApp.IModelData이 필요합니다.

인터페이스 IModelData을 자체 어셈블리로 이동하고 서버 응용 프로그램과 클라이언트 응용 프로그램 모두이 세 번째 어셈블리를 참조하도록하여이 문제를 해결할 수 있습니다. 그것이 우리가 일하는 것입니다. 우리의 모든 서비스 계약은 별도의 어셈블리에 있습니다 (실제로는 2 개이지만 다른 이야기입니다).

다른 몇 가지 참고 사항 : 클라이언트는 서비스를 호스팅하지 않는

, 당신은 클래스에서 [ServiceContract] 속성을 제거 할 수 있습니다. 클라이언트는 필요하지 않습니다.

서버 앱에서 Server.Scraper = this;은 무엇인가요? 서비스의 Scraper 속성에 양식을 할당하는 것으로 보입니다. 그러나 코드에 해당 속성이 표시되지 않습니다. 또한 서비스는 실제로 속성을 사용하지 않습니다 (나는 당신이 그것을 할 수있는 곳을 보았지만 직관적이지는 않았습니다). 서비스 전체가 UI를 가지고 있지 않기 때문에 서비스에 전체 양식을 할당하고 싶지는 않을 것입니다. 사용자 인터페이스는 데이터를 제공하고 서비스에서 데이터를 수신합니다.