none
vs2010: 웹서비스를 사용하려는데... 함수값이 IIS 환경에서는 리턴되지 않습니다. RRS feed

  • 질문

  • 수고하십니다. 다음과 같이 웹서비스를 만들고 함수를 호출했는데...

    IIS서버에서만 동작이 잘 되지 않아 문의 드립니다.

    -------------------------------------------------------------------------

    웹서비스를 구축하고자, 아래와 같이 사용환경을 설치하였습니다.

    1.사용환경: vs2010(한글버전), windows7, IIS7.0, Framework4.0

    [프로젝트 속성]창-[웹]탭 선택후,

    1. [visual studio 개발서버 사용]를 선택한 후, 해당함수를 동작시키면 정상적으로 계산된 값(예:1)을 리턴해서 보여줍니다.

    (웹서비스 asmx파일은 특정DLL을 참조해서, 특정함수를 호출했습니다.)

    .

    .

    .

    2.[IIS 웹서버 사용]를 선택한 후, 해당함수를 동작시키면... 아무값도 리턴하지 않고... 공백값("")으로 나옵니다.

    (웹서비스 asmx파일은 특정DLL을 참조해서, 특정함수를 호출했습니다.)

    DLL파일을 참조하지 않은 Hello라는 단순함수에서는 정상적으로 결과문자값을 리턴했습니다.

    (우측에 있는 [가상디렉토리 만들기] 눌렀을때 정상적으로 동작했고...

    .

    .

    .<정상 동작시 화면:[visual studio 개발서버 사용]> =>IIS에서는 "1"이라는 값이 안 나옵니다.

    .

    1.신뢰할 수 있는 사이트에 localhost를 추가해 보기도 했는데...  변화가 없네요...

    무슨 설정을 해줘야 될까요? 이 부분이 되야 웹서비스를 할 수가 있어서요...??!!

    .










    • 편집됨 Delight72 2012년 10월 30일 화요일 오전 9:51
    2012년 10월 30일 화요일 오전 9:06

답변

모든 응답

  • 일단 비슷한 시행착오를 겪은 분이 더 자세한 답변을 해드릴 수 있겠지만.

    그 전에, 해당 코드가 IIS 서버에서 호스팅될 때 실제로 실행이 되는지 한번 확인해 보시겠어요. Trace.WriteLine으로 출력하고, sysinternals의 dbgview를 이용해서 그 출력유무를 확인하는 식으로 진행하면 될 것 같습니다.

    그리고, fiddler 같은 도구를 이용해서 asmx를 위에서 보여주신 방식대로 IE를 이용하여 호출할 때 오고 가는 HTTP 데이터를 보는 것도 확인할 필요는 있을 것 같습니다.

    2012년 10월 31일 수요일 오전 12:35
  • 답변감사합니다.

    확인해 보니... 함수동작에 차이가 있네요...

    ------------------------------------

    공유메모리를 사용하는데...

                    IntPtr hMapFile = OpenFileMapping(                                              // Open the named file mapping.
                                                                                                        FileMapAccess.FILE_MAP_ALL_ACCESS,
                                                                                                        false,
                                                                                                        @"Global" + str_맵파일명);

    [visual studio 개발서버]일때만 hMapFile 리턴값이 존재하고...

    [IIS 서버]일때는 hMapFile 리턴값이 존재하지 않습니다.

    이 부분이 문제인 것 같은데... IIS에서도 정상적으로 값을 리턴 받으려면... 무슨 설정을 해야 할까요???


    • 편집됨 Delight72 2012년 11월 8일 목요일 오전 7:38
    2012년 10월 31일 수요일 오전 9:25
  • MapViewOfFile 호출한 다음 곧바로, Marshal.GetLastWin32Error() 를 이용해서 반환값을 확인해 보세요.

    • 답변으로 표시됨 Jina LeeModerator 2012년 11월 1일 목요일 오전 3:12
    • 답변으로 표시 취소됨 Delight72 2012년 11월 6일 화요일 오전 12:01
    2012년 10월 31일 수요일 오후 12:30
  • access denied... (IIS에서만) 인 것으로 보입니다.

    검색을 하다보니 공유메모리(shared memory)를 웹서비스에서 사용할때는, 무슨 security 설정을 해 줘야 정상적으로 동작한다는 글을 보게 되었습니다. C#에서 Global 경로를 추가해보거나... 나름 security 설정을 코드에 추가해 보았지만... 여전히 IIS 환경하에서는 되지 않네요...

    비쥬얼스튜디어 서버와, IIS 환경하에서 셋팅에서 차이가 나는 것 같은데...

    1.메모리를 createfilemapping에서 해줘야 하는 C# 샘플코드나...

    또는 IIS7.0에서 어떤 셋팅이 필요한지를 알려주시면 감사하겠습니다.





    • 편집됨 Delight72 2012년 11월 6일 화요일 오전 12:11
    2012년 11월 6일 화요일 오전 12:06
  • 안녕하세요. 엄준일 입니다.

    web.config 파일에서 <system.web> 하위에 다음을 추가해 보시기 바랍니다.

      <system.web>
    		<trust level="Full"/>

    감사합니다.


    엄준일 (Junil, Um) Blog : http://blog.powerumc.kr TeamBlog : http://devwith.com Open Source Administrator : powerumc.codeplex.com

    2012년 11월 6일 화요일 오후 1:38
  • 답변감사합니다. 좀 늦게 확인했네요...^^

    말씀대로 해봤는데...

    여전히

    IntPtr hMapFile = OpenFileMapping(...

    에서 포인트값이 0으로 나오고 차이가 없네요...--;


    • 편집됨 Delight72 2012년 11월 8일 목요일 오전 7:48
    2012년 11월 8일 목요일 오전 7:09
  • 현재 문제점을 재현할 수 있는 코드를 만들어 봤습니다.

    1.첫번째 소스를 버튼하나를 가진 윈폼에 복사, 붙여넣기를 하고 버튼을 누르면... 윈폼에서 공유메모리 생성부가 생성되고...

    2.두번째 소스를 웹서비스에 붙여넣고 실행하면... 공유메모리 오픈모드가 동작됩니다.

    -------------------

    3. visual studio 개발서버(VS2010)에서는 정상적으로 핸들값을 리턴하지만...

    IIS 모드에서 실행하면... 값이 없는 0을 리턴하는 것을 볼 수 있습니다.

    ----------------------------------

    어떻게 해야... IIS모드에서도 똑같이 정상적인 리턴값을 받을 수 있을지요???

    --------------------------------------------------------------------------------

    1. the below is the perfect code for winform to create the sharedmemory and reappear the trouble....

    --------------------------------------------------------------------

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    //----------------------------------------------------------------------------------------
    using System.Runtime.InteropServices;
    using System.Security;
    using System.Windows.Forms;
    using System.Collections;
    //-------------------------------------------------------
    using DWORD = System.UInt32;
    
    namespace WebTest
    {
        public partial class Form1 : Form
        {
    
            const uint BUFFER_SIZE = 256;
            public const int INVALID_HANDLE_VALUE = -1;
            //----------------------------------------------------------------------------------------
            public enum FileProtection : uint
            {
                PAGE_NOACCESS = 0x01,
                PAGE_READONLY = 0x02,
                PAGE_READWRITE = 0x04,
                PAGE_WRITECOPY = 0x08,
                PAGE_EXECUTE = 0x10,
                PAGE_EXECUTE_READ = 0x20,
                PAGE_EXECUTE_READWRITE = 0x40,
                PAGE_EXECUTE_WRITECOPY = 0x80,
                PAGE_GUARD = 0x100,
                PAGE_NOCACHE = 0x200,
                PAGE_WRITECOMBINE = 0x400,
                SEC_FILE = 0x800000,
                SEC_IMAGE = 0x1000000,
                SEC_RESERVE = 0x4000000,
                SEC_COMMIT = 0x8000000,
                SEC_NOCACHE = 0x10000000
            }
    
            //----------------------------------------------------------------------------------------
            [DllImport("Kernel32.dll", SetLastError = true)]
            public static extern IntPtr CreateFileMapping(
                IntPtr hFile,                   // Handle to the file
                IntPtr lpAttributes,            // Security Attributes
                FileProtection flProtect,       // File protection
                uint dwMaximumSizeHigh,         // High-order DWORD of size
                uint dwMaximumSizeLow,          // Low-order DWORD of size
                string lpName                   // File mapping object name
                );
    
    
            [StructLayout(LayoutKind.Sequential)]
            public struct SECURITY_ATTRIBUTES
            {
                public DWORD nLength;
                public IntPtr lpSecurityDescriptor;
                [MarshalAs(UnmanagedType.Bool)]
                public bool bInheritHandle;
            }
    
            public enum FileMapAccess
            {
                FILE_MAP_COPY = 0x0001,
                FILE_MAP_WRITE = 0x0002,
                FILE_MAP_READ = 0x0004,
                FILE_MAP_ALL_ACCESS = 0x000F001F
            }
    
    
            [DllImport("Kernel32.dll", SetLastError = true)]
            public static extern IntPtr MapViewOfFile(
                IntPtr hFileMappingObject,      // Handle to the file mapping object
                FileMapAccess dwDesiredAccess,  // Desired access to file mapping object
                uint dwFileOffsetHigh,          // High-order DWORD of file offset
                uint dwFileOffsetLow,           // Low-order DWORD of file offset
                uint dwNumberOfBytesToMap       // Number of bytes map to the view
                );
    
            [DllImport("kernel32.dll", SetLastError = true)]
            public static extern bool CloseHandle(IntPtr hHandle);
    
            //************************************************************************************
            public Form1()
            //************************************************************************************
            {
                InitializeComponent();
            }
    
            //************************************************************************************
            private void button1_Click(object sender, EventArgs e)
            //************************************************************************************
            {
                try
                {
                    //----------------------------------------------------------------------------------------
                    SECURITY_ATTRIBUTES sa = new SECURITY_ATTRIBUTES();
                    sa.nLength = (DWORD)System.Runtime.InteropServices.Marshal.SizeOf(sa);
                    sa.lpSecurityDescriptor = IntPtr.Zero;
                    sa.bInheritHandle = true;
    
                    IntPtr attr = Marshal.AllocHGlobal(Marshal.SizeOf(sa));
                    Marshal.StructureToPtr(sa, attr, true);
    
                    //string strMapFileName = "Local\\HelloWorld";        
                    IntPtr hMapFile = CreateFileMapping(
                                                                                        (IntPtr)INVALID_HANDLE_VALUE,
                                                                                        attr,
                                                                                        FileProtection.PAGE_READWRITE,
                                                                                        0,
                                                                                        BUFFER_SIZE,
                                                                                        @"Global\" + "NameForTest");
    
    
    
                    //----------------------------------------------------------------------------------------
    
                    IntPtr pBuf = MapViewOfFile(
                                                                                                hMapFile,
                                                                                                FileMapAccess.FILE_MAP_ALL_ACCESS,
                                                                                                0,
                                                                                                0,
                                                                                                BUFFER_SIZE);
    
                    if (pBuf == IntPtr.Zero)
                    {
                        MessageBox.Show(string.Format("Err:cannot create the sharedmemory!!!"));
                        CloseHandle(hMapFile);
                        return;
                    }
                    else
                    {
                        MessageBox.Show(string.Format("Succeed in create the sharedmemory!!!"));
                    }
    
                    //----------------------------------------------------------------------------------------
                }
    
    
                //----------------------------------------------------------------------------------------
                catch (Exception ex)
                {
                    MessageBox.Show(string.Format( ex.Message));
                }
            }
        }
    }


    ------------------------------------------

    2. the below is code for webservice to open the shared memory.

    -------------------------------------------------------------------------

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Services;
    //-----------------------------
    using System.Runtime.InteropServices;
    
    namespace WebApplication1
    {
        /// <summary>
        /// WebService1
        /// </summary>
        [WebService(Namespace = "http://tempuri.org/")]
        [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
        [System.ComponentModel.ToolboxItem(false)]
        // ASP.NET AJAX를 사용하여 스크립트에서 이 웹 서비스를 호출하려면 다음 줄의 주석 처리를 제거합니다. 
        // [System.Web.Script.Services.ScriptService]
        public class WebService1 : System.Web.Services.WebService
        {
    
            [WebMethod]
            public string HelloWorld()
            {
                return "Hello World";
            }
    
    
    
            public enum FileMapAccess
            {
                FILE_MAP_COPY = 0x0001,
                FILE_MAP_WRITE = 0x0002,
                FILE_MAP_READ = 0x0004,
                FILE_MAP_ALL_ACCESS = 0x000F001F
            }
    
            [DllImport("kernel32.dll", SetLastError = true)]
            public static extern IntPtr OpenFileMapping(
              FileMapAccess dwDesiredAccess,    // Access mode
              bool bInheritHandle,              // Inherit flag
              string lpName                     // File mapping object name
              );
    
            [DllImport("kernel32.dll", SetLastError = true)]
            public static extern bool CloseHandle(IntPtr hHandle);
    
            [WebMethod]
            //**********************************************************************************************
            public bool CreateMapView()
            //**********************************************************************************************
            {
                try
                {
    
                    //----------------------------------------------------------------------------------------
    
                    IntPtr hMapFile = OpenFileMapping(                                              // Open the named file mapping.
                                                                                                        FileMapAccess.FILE_MAP_ALL_ACCESS,
                                                                                                        false,
                                                                                                        @"Global\" + "NameForTest");
    
                    if (hMapFile == IntPtr.Zero)
                    {
                        Console.WriteLine("Err: cannot open the shared memory!!!");
                        return false;
                    }
                    else
                    {
                        Console.WriteLine("succeed in opening the shared memory!!!");
                        return true;
                    }
    
    
    
    
                }
    
    
    
    
    
                //----------------------------------------------------------------------------------------
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    return false;
                }
            }
    
    
        }
    }



    • 편집됨 Delight72 2012년 11월 13일 화요일 오전 5:41
    2012년 11월 13일 화요일 오전 5:33
  • 우선, .NET 4.0 이니 P/Interop 으로 하지 마시고, Managed Memory-mapped 타입을 사용하시는 것이 좋겠지요.

    MemoryMappedFile Class
    ; http://msdn.microsoft.com/en-us/library/system.io.memorymappedfiles.memorymappedfile.aspx

    그리고, 보안 오류이기 때문에 IIS 에서 생성하는 경우 apppool의 권한을 따라가게 됩니다. AppPool의 권한이 너무 강하면, 그 mmf 를 여는 다른 프로그램에서 열 수가 없고 그 반대의 경우도 마찬가지입니다. 따라서, mmf 자체를 적당한 권한으로 설정해서 여는 것이 중요합니다. 이에 대해서는 MemoryMappedFileSecurity 타입을 적절하게 사용해 주시면 됩니다.

    MemoryMappedFileSecurity Class
    ; http://msdn.microsoft.com/en-us/LIbrary/system.io.memorymappedfiles.memorymappedfilesecurity(v=VS.110)

    2012년 11월 13일 화요일 오후 12:22