.NET Compact Framework의 네트워크 프로그래밍

업데이트: 2007년 11월

.NET Compact Framework는 XML Web services를 기본적으로 지원하며 다음과 같은 프로토콜 기능을 제공합니다.

  • HTTP 기반 프로토콜

  • NTLM 인증

  • SOAP 인코딩된 XML 콘텐츠. 여기에는 ADO.NET 데이터 집합을 전달하는 기능이 포함됩니다.

  • HTTP SOAP 메시지를 보내고 응답으로 SOAP 메시지를 받을 수 있는 웹 요청 및 웹 응답 메서드

  • XML SOAP 메시지 간에 메서드 호출과 임의의 개체를 serialize 및 deserialize할 수 있는 SOAP 라이브러리 및 메서드

HTTP 요청

다음은 HTTP 요청의 송수신과 관련된 항목입니다.

  • 에뮬레이터를 사용하는 경우에는 localhost를 서버 이름으로 사용하지 않아야 하며 웹 서비스를 호스팅하는 개발 컴퓨터의 이름 또는 IP 주소를 서버 이름으로 지정해야 합니다.

    장치와 마찬가지로 에뮬레이터에도 IP 주소가 별도로 지정됩니다. localhost를 사용하면 개발 환경이나 다른 데스크톱 컴퓨터에서 호스팅하는 웹 서비스가 아니라 에뮬레이터 자체에서 웹 서비스에 직접 연결합니다.

    예를 들면 다음 대신

    https://localhost/myWebService/Service1.asmx

    다음을 지정합니다.

    http://ComputerName/myWebService/Service1.asmx

  • HttpWebRequest를 사용하여 HTTP 요청을 수행하면 장치는 기존 네트워크 연결을 사용할 수 없는 경우 새 네트워크 연결을 시작합니다. 따라서 사용 가능한 연결이 있는지 여부만 확인하기 위해 HTTP 요청을 수행하는 경우에도 장치에서 연결(예: GPRS 연결)을 시작하려고 시도합니다.

  • .NET Compact Framework는 GlobalProxySelection.Select 속성에 프록시 정보를 저장하지 않지만 코드에 값을 지정할 경우 HTTP 연결에 대해 이 속성을 사용합니다.

  • 인터넷에 연결하려면 로컬 프록시 설정을 지정해야 할 수도 있습니다. 다음 코드는 포트 80의 프록시 설정을 보여 줍니다.

    System.Net.GlobalProxySelection.Select = new WebProxy("http://myproxy:80");
    
  • AllowWriteStreamBuffering을 false로 설정하면 데이터가 메모리에 버퍼링되지 않으며 이 데이터를 웹 서버의 인증 요청 또는 리디렉션에 사용할 수 없습니다.

  • 작업을 제대로 수행하려면 절대 경로 정보를 지정해야 합니다.

    상대 경로를 확인할 때 아래 Windows CE의 동작에 주의합니다.

    file://myfile이 \\myfile로 확인됩니다.

    file:///myfile이 루트 디렉터리의 \myfile로 확인됩니다.

  • 현재 컴퓨터에 설치된 네트워크 프로토콜이 50개를 초과하는 경우 .NET Framework Dns.GetHostName 메서드에서는 예외를 throw합니다.

    이 문제를 해결하려면 실제로 필요하지 않은 네트워크 프로토콜을 제거합니다. 이렇게 하려면 Windows Device Manager를 사용하여 사용하지 않는 네트워크 어댑터를 제거합니다. 또 다른 방법은 설치된 프로토콜이 있는 응용 프로그램을 제거하는 것입니다.

보안 모바일 통신

기본적인 보안 모바일 통신에는 두 가지 방법이 있습니다.

  • HTTP 인증

    .NET Compact Framework에서는 기본 인증과 다이제스트 인증을 지원합니다. 이러한 인증 메커니즘은 간단하고 해당 보안 방법과 단점(예: 웹 서비스가 HTTP 바인딩으로 제한되는 점)이 상당히 잘 알려져 있습니다.

    .NET Compact Framework 버전 2.0에서는 기존의 기본 인증이나 다이제스트 인증에 대한 코드 변경을 필요로 하지 않는 NTLM 또는 Kerberos("Windows 통합 인증")를 실행하는 서버를 지원합니다.

  • 사용자 지정 보안 헤더

    .NET Compact Framework에서는 현재 WS-Security(Web Services Security) 및 WSE(Web Service Enhancements)를 지원하지 않습니다.

    또한 인증할 때 HTTP를 사용하는지 사용자 지정 헤더를 사용하는지에 관계없이 SSL을 사용하여 보안을 강화할 수 있습니다. 기본 인증은 이름과 암호를 일반 텍스트로 전달하므로 SSL 내에서 실행하지 않는 경우 특히 안전하지 않습니다. 그러나 SSL과 함께 사용하는 경우 자격 증명이 실수로 대상 서버에 알려질 수 있다는 중요한 문제를 제외하면 안전합니다.

참고   .NET Compact Framework는 X509 인증서를 사용하는 클라이언트측 인증을 지원하지 않습니다.

콘텐츠 길이 고려 사항

스트림된 콘텐츠에 대한 HTTP 웹 요청을 POST 프로토콜을 사용하여 전송하는 경우에는 콘텐츠 길이를 지정해야 합니다. SendChunked가 false이고 Method = POST라고 가정하고 ContentLength에 대한 값을 지정합니다.

전체 .NET Framework와 달리 .NET Compact Framework에서는 메모리 사용에 제약을 받기 때문에 데이터를 미리 버퍼링하지 않습니다. 버퍼링을 확인하려면 SendChunked를 false로 설정합니다.

콘텐츠 길이가 0인 요청 스트림은 올바르게 가져오거나 닫지 않은 경우 ObjectDisposedException이 발생합니다. 콘텐츠 길이가 0인 요청을 처리하려면 아래 코드 예제에서처럼 GetRequestStream 메서드를 명시적으로 호출한 다음 Write 메서드를 호출하지 않고 반환된 스트림에서 Close 메서드를 호출해야 합니다.

private static void ZeroLengthRequest()
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(
        requestUri + "?dummy=true");
    request.AllowWriteStreamBuffering = true;
    request.Credentials = CredentialCache.DefaultNetworkCredentials;
    request.Credentials = netCred;
    request.ConnectionGroupName = "mygroup";
    request.ContentLength = 0;
    request.KeepAlive = true;
    request.Method = "POST";
    request.ServicePoint.UseNagleAlgorithm = false;
    request.Timeout = System.Threading.Timeout.Infinite;
    request.UnsafeAuthenticatedConnectionSharing = true;
    Stream req = request.GetRequestStream();
    req.Close();
    using (request.GetResponse())
    {
        ...
    }
}
Private Shared Sub ZeroLengthRequest()
        Dim request As HttpWebRequest = _
           CType(WebRequest.Create(requestUri + "?dummy=true"), _
           HttpWebRequest)
        request.AllowWriteStreamBuffering = true
        request.Credentials = CredentialCache.DefaultNetworkCredentials
        request.Credentials = netCred
        request.ConnectionGroupName = "mygroup"
        request.ContentLength = 0
        request.KeepAlive = true
        request.Method = "POST"
        request.ServicePoint.UseNagleAlgorithm = false
        request.Timeout = System.Threading.Timeout.Infinite
        request.UnsafeAuthenticatedConnectionSharing = true
        Dim req As Stream = request.GetRequestStream
        req.Close
        request.GetResponse
End Sub

참고 항목

기타 리소스

.NET Compact Framework의 네트워킹 및 연결