WCF를 사용하여 SOAP 바디에 XML을 기술하여 메시지를 주고받고 있습니다..
원격 호출이 아닌 문서전송으로 모두 해결해야 합니다.
클라이언트가 전송을하고, 그에대한 응답메시지를 받게됩니다.
메시지를 보내서 재대로 메시지가 왔는지 출력을 해보았을때 메시지는 잘 오는걸 확인했습니다만.. SOAP 바디에 있는 XML을 파싱하는
방법을 모르겠군요.. 단기간내에 완벽히 이해를 못하고 오픈소스를 사용해서인지.. 잘 이해도 안가고 큰일입니다;;
일단 제가 짠 소스입니다.
[클라이언트]
[ServiceContract]
[XmlSerializerFormat]
public interface IServiceDescription
{
[OperationContract(Action = "
http://www.example.org/oceanwatch/ServiceDescriptionRequest", IsOneWay = true)]
void ServDesc(ServDescReq request);
}
[MessageContract(IsWrapped=false)]
public class ServDescReq
{
[MessageBodyMember]
public ServDesc ServDesc;
public ServDescReq() { }
public ServDescReq(ServDesc report) { ServDesc = report; }
}
[XmlSchemaProvider(null, IsAny = true)]
public class ServDesc : IXmlSerializable
{
string _namespace = "
http://www.w3c.org/ssdl/ServiceDescriptionResponse";
public ServDesc() { }
public System.Xml.Schema.XmlSchema GetSchema()
{
return null;
}
public void ReadXml(XmlReader reader)
{
throw new Exception("The method or operation is not implemented.");
}
public void WriteXml(XmlWriter writer)
{
// SOAP 바디에 들어갈 XML, 상황에 따라서 더 복잡한 문서가 들어갈 수도 있습니다.
writer.WriteStartElement("ssdl", "SSDL", _namespace);
writer.WriteStartElement("Request", _namespace);
writer.WriteStartElement("ssdl", "RequestDescription", _namespace);
writer.WriteEndElement();
writer.WriteEndElement();
}
}
위의 소스로 메시지를 생성하구요...
using (ChannelFactory<IServiceDescription> channelNotification = new ChannelFactory<IServiceDescription>("Connect"))
{
channelNotification.Open();
IServiceDescription manager = channelNotification.CreateChannel();
ServDescReq request = new ServDescReq(new ServDesc());
Console.ForegroundColor = ConsoleColor.Cyan;
Console.WriteLine("EventSource에 보낼 ServiceDescription 요청(XML 문서)은 다음과 같습니다.");
Console.ForegroundColor = ConsoleColor.White;
Util.ShowMe(request);
Console.ForegroundColor = ConsoleColor.Cyan;
Console.WriteLine();
Console.WriteLine();
Console.WriteLine("EventSource에 보낼 ServiceDescription 요청(SOAP 문서)은 다음과 같습니다.");
manager.ServDesc(request);
Console.ResetColor();
channelNotification.Close();
}
위와 같이 서버에 메시지를 전송합니다.
[서버]
[ServiceContract]
[XmlSerializerFormat]
public interface IServiceDescriptionRequest
{
[OperationContract(Action = "
http://www.example.org/oceanwatch/ServiceDescriptionRequest", IsOneWay = true)]
void ServDesc2(Message request);
}
public class ServiceDescriptionRequest : IServiceDescriptionRequest
{
public void ServDesc2(Message request)
{
Console.ForegroundColor = ConsoleColor.Cyan;
Console.WriteLine("Subscriber에서 보낸 서비스 기술 요청(XML 원문)은 다음과 같습니다.");
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine(request);
Console.WriteLine();
Console.ForegroundColor = ConsoleColor.Cyan;
Console.WriteLine("ServiceDescriptionResponse를 보냅니다. - Press any key to continue");
Console.ResetColor();
}
}
위는 클라이언트의 메시지를 받는 인터페이스 이고요..
using (ServiceHost serviceHost = new ServiceHost(typeof(ServiceDescriptionRequest)))
{
Console.ForegroundColor = ConsoleColor.Cyan;
Console.WriteLine("Waiting Connect...");
Console.ResetColor();
serviceHost.Open();
Console.ReadLine();
serviceHost.Close();
}
다음과 같이 호스트를 생성해서 클라이언트의 메시지를 받습니다.
일단 위 소스로 전송된 메시지를 찍어보면 보낸되로 출력되는것으로보아 작동은 잘 하고있는거 같은대요..
받은 Message 를 어떻게해야 파싱할 수 있는지요...
[최초 등록일: ]
[최종 수정일: 10/10/2007]