2009-10-22 4 views
2

C#을 사용하여 http POST 요청을 통해 ASP.NET 웹 서비스를 호출하려고합니다 (즉, wsdl.exe를 실행하여 생성 된 SoapHttpClientProtocol 객체를 사용하고 싶지 않습니다.). 지금까지 내가 말할 수있는 http 요청을 통해 ASP.NET 웹 서비스 메서드 호출

이 프로세스가 포함됩니다

  1. 가 URL을 가리키는 HttpWebRequest를 객체를 생성/방법에 웹 서비스의 방법;

  2. SOAP xml envelope 만들기;

  3. XmlSerializer를 사용하여 웹 메서드에 전달할 매개 변수를 serialize합니다.

  4. 요청을 작성하고 응답을 구문 분석하십시오.

생성 된 코드를 복사하여 사용하지 않고이 작업을 수행하고 싶습니다.

(1) 매우 단순한 것처럼 보입니다.

(2) 여기 엔벨로프가 표준인지, 아니면 내가 부르고있는 웹 서비스 방법에 따라 어떻게 바뀌어야하는지 모릅니다. 서비스에 필요한 경우 사용자 정의 비누 헤더를 추가해야 할 수도 있습니다.

(3)이 작업을 수행하는 프로세스는 무엇입니까? 나는 이런 식으로 뭔가 할 필요가 있다고 가정합니다 또한

MyClass myObj; 
XmlSerializer ser = new XmlSerializer(myObj.GetType()); 
TextWriter writer = new StringWriter(); 
ser.Serialize(writer, myObj); 
string soapXml = writer.ToString(); 
writer.Close(); 

을, 나는 비누에 soapXml를 추가해야합니다 추측 : Body 요소

(4) 나는 추출의 내용을 역 직렬화한다고 생각 비누 : 바디 요소. (3)의 과정을 역으로해도 괜찮습니까? 내가 여기 이렇게 만하고 이유를 모르는

감사합니다,

K.

+1

그냥 궁금

는 다음과 같은 SOAP 서비스 있다고 가정? 왜 시도하고 테스트 한 도구를 사용하지 않습니까? – David

+0

http 요청 수준에서 웹 서비스 호출에 액세스하면 soap/http 헤더 설정과 같은 작업을보다 세밀하게 제어 할 수 있다고 생각했습니다. 또한 때때로 웹 서비스 클라이언트를 생성하는 wsdl이 사용할 수 있습니다 (메서드 서명이 알려진 경우에도) ... –

답변

7

수동으로 웹 서비스를 호출하는 예입니다. 프로덕션 코드에서 이것을 절대 사용하지 않겠다고 약속하십시오.

public class Foo 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
public class Service1 : System.Web.Services.WebService 
{ 
    [WebMethod] 
    public string HelloWorld(Foo foo) 
    { 
     return "Hello World"; 
    } 
} 

당신은 다음과 같이 수동으로 호출 할 수 있습니다 :이 어려운 방법을하고 싶은 이유에

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (WebClient client = new WebClient()) 
     { 
      client.Headers.Add("SOAPAction", "\"http://tempuri.org/HelloWorld\""); 
      client.Headers.Add("Content-Type", "text/xml; charset=utf-8"); 
      var payload = @"<?xml version=""1.0"" encoding=""utf-8""?><soap:Envelope xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema""><soap:Body><HelloWorld xmlns=""http://tempuri.org/""><foo><Id>1</Id><Name>Bar</Name></foo></HelloWorld></soap:Body></soap:Envelope>"; 
      var data = Encoding.UTF8.GetBytes(payload); 
      var result = client.UploadData("http://localhost:1475/Service1.asmx", data); 
      Console.WriteLine(Encoding.Default.GetString(result)); 
     } 
    } 
} 
+0

+1은 "프로덕션에서이 작업을 시도하지 마십시오" –

+0

Darin, thanks. 명확히하기 위해 http 요청 수준에서 webservice 메서드를 호출 할 때 본질적으로 잘못된 점이 있습니까? 또한 웹 메서드 서명과 인수가 있으면 비누 바디를 구성하는 일반적인 방법이 있습니까? –

+0

나는 이것을 부분적으로 도움이 되었기 때문에 이것을 대답으로 지명하고 싶다. 그러나 누군가 내가 webmethod의 주장에 비추어 비누 몸체를 만드는 것에 대해 물어 본 질문을 명확하게하는 것을 도울 수 있는가? –

관련 문제