ASP.NET Core + WPF 가 가능한가요?

안녕하세요,

업무용으로 간단한 Windows App을 하나 만드려고 Visual Studio를 설치했습니다.

http 서버 띄워서 원격지 명령도 받아야 해서 알아보니 ASP .NET Core는 IIS 없이 self hosting이 가능하다고 하더라구요.

그런데 wpf 타입으로 프로젝트를 만들고 나면 종속성에 Microsoft.AspNetCore.App 이 없습니다…

해서 Project sdk값을 Microsoft.Net.Sdk → Microsoft.Net.Sdk.web 으로 변경해보니, wpf 프레임워크와 asp .net core 프레임워크를 동시에 참조할 수 있더군요.

근데 실행해보면 asp .net core 용으로 도스창이 하나 더 뜨는 문제가 있습니다.

제가 원하는건 single exe 파일로 트레이 상주하는 작은 GUI 프로그램(http request handler를 포함한) 만드는 것인데 어째 하면할수록 visual studio 용량만 늘어나는 것 같고 되는것도 없어서 속상하네요…ㅠㅠ

혹시 이 조합이 불가능한 것일까요?

1개의 좋아요

솔직히 많이 헷갈리는데요???
wpf+webapp 합친다는 개념이좀 이상하네요
WPF가 서버랑 양방향 통신을 해야한다면 Web socket 이 있고
webservice 가 필요하다며 ? 윈도우 서비스에 등록해서 호스팅 하고
wpf는 이것랑 통신하는 방법이 있습니다

1개의 좋아요

의도하시는게 정확한지는 확실하지 않지만,
저도 WPF 애플리케이션을 통해 셀프 호스팅을 함께 구현해봤던 기억이 있습니다.
(왜 그랬는지까지는 기억이 나질 않네요!)

WPF 애플리케이션 또는 콘솔 애플리케이션으로 프로젝트 생성하시고,
Microsoft.Net.Sdk.Web 이런 방식으로 변경하지 마시고 직접 Nuget을 통해 self 호스팅 관련 라이브러리를 참조(설치)해보시기 바랍니다.

만약 콘솔 애플리케이션을 생성했다면 프로젝트 속성에서 <UseWPF>true</UserWPF> 추가하면 됩니다.

그 다음 Application에서 셀프 호스팅을 동작시키면 됩니다.
(원하시는 기능을 다 충족시키는지는 모르겠네요.)

GPT를 통해 확인해보면 비슷한 내용도 알려주는데요. 맥략은 비슷하니 한번 시도해보시기 바랍니다!

public partial class App : Application
{
    private IHost webHost;

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        
        webHost = Host.CreateDefaultBuilder()
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            })
            .Build();

        webHost.Start();
    }

    protected override void OnExit(ExitEventArgs e)
    {
        webHost?.Dispose();
        base.OnExit(e);
    }
}

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseRouting();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
}
2개의 좋아요

무슨 말씀이신지 말 모르겠습니다.

이 부분을 보면 윈도우 앱을 만들되 프론트를 웹기술을 이용해 만들고 싶으신건가요? 그렇다면 Blazor Hybrid WPF를 확인해보시는게 어떨까 싶습니다.
WPF(Windows Presentation Foundation) Blazor 앱 빌드 | Microsoft Learn

그게 아니라면 그냥 웹서버를 asp.net core로 만들고 웹뷰로 wpf로 띄워야 하는건가요? 이게 아니라 그냥 서버에서 명령만 받아오는거면 WPF로 만들어서 서버랑 통신하면 되지 않나요?

2개의 좋아요

ASP.NET Core와 플랫폼에 대한 이해가 없어서 헷갈리시는거 같네요.
ASP.NET Core는 개발을 위한 sdk 집합이라고 할 수 있습니다.
ASP.NET Core를 이용해서 웹서버, 데스크탑앱, 모바일 앱등을 만들 수 있습니다.
WPF도 ASP.NET Core에서 만들 수는 있지만 윈도우 전용의 데스크탑앱만 만들 수 있습니다.
결론적으로,
ASP.NET Core 환경에서 웹서버 프로젝트를 만들고,
다시 별도의 프로젝트로 ASP.NET Core 환경의 WPF 앱을 만들어야되고,
이 둘은 TCP나 HTTP등의 기술을 이용해서 통신을 해야됩니다.

2개의 좋아요

저는 WPF로 프로젝트를 생성하고 ASP.NET Core 관련 Nuget 패키지 설치한 후 WebHostBuilder를 생성하여 사용하고 있습니다. 이렇게 하면 WPF 앱에서 ASP.NET Core 서비스가 됩니다.
위에 @jamesnet214 님이 설명해주신 방법 참고하시면 됩니다.

2개의 좋아요

@Code_Pasta 님이 말한 것 처럼 구성하면 정말 콘솔이 뜹니다. OutputTypeWinExe로 해도 콘솔창이 뜨는데요, 혹시나 해서 컴파일된 경로의 EXE를 직접 실행하니 콘솔이 뜨지 않고 실행되는 것으로 보아 Visual Studio 환경에서 핫리로드 등의 구성에 의해 콘솔이 뜨는것은 아닌가 추측합니다.

2개의 좋아요

안녕하세요. wpf gui app을 하나 만드는데 그 app 기능중에 웹서버 기능이 필요하다는 것입니다. :innocent:

1개의 좋아요

와우! 감사합니다 한번 해볼게요!!! :pray:

1개의 좋아요

wpf app 자체가 간단한 http server 기능도 겸하게 하고 싶어서요.

1개의 좋아요

말씀대로라면 ASP .net core 하나로 제가 원하는걸 만들 수 있다는 건가요?
WPF를 버리고 Blazor로 프론트를 만들고 서브로 백그라운드 구동되는 web api 서비스도 구동이 가능할까요?

2개의 좋아요

저는 자주 WPF 나 윈폼을 열고 간이 웹서버 (ASP.NET Core) 로 많이 사용 합니다.
용도는 다른 플랫폼 개발자와 협업인데요. 아무래도 그분들은 소켓을 통한 저수준 통신보다 HTTP 프로토콜이 편리하니 , 이러한 분들과 같이 일 할때 유용합니다. @jamesnet214 님께서 알려주신 방법도 가능하며, WPF 프로젝트 에서도 간단히 활용 하실 수 있습니다. WPF 의 csproj 파일에 아랫줄을 추가해주시면 자동으로 프레임워크가 붙습니다.

<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>

또한 WPF 의 App Class (시작점) 단에서 ~

 public App():base()
 {
     var webthread = new Thread(new ParameterizedThreadStart(delegate
     {
         new Communication.web.Startup(null);
     }));
     webthread .IsBackground = true;
     webthread .Start();
 }

처럼 별도 스레드로 웹서버 분리 하시면 ASP.NET CORE의 풀 피쳐를 사용 하실 수 있을껍니다.
늦었지만 도움이 되셨으면 좋겠네요.

3개의 좋아요

지금 dll들 하나하나 추가하다가 framework assembly 통으로 추가하는 방법을 검색하고 있었는데…

여기 답이 있었네요. 감사합니다!!

1개의 좋아요

경태님, 한가지만 더 알려주시겠어요?
App():base() 여기에 추가하는 코드에,

new Communication.web.Startup(null);

이 부분에서 Communication에 대한 참조가 없는데, 이게 어떤 패키지에 있는 클래스에요?

1개의 좋아요

.net framework 이고, 알고 있는 몇 사람만 내부망에서 접속한다

라고 가정을 한다면,

  1. WPF 앱이 반드시 필요한가요?
    보통의 경우, full stack (Asp.Net core MVC/Wep Page/Blazor Server)앱을 만든는 쪽이 코드량과 관리 포인트가 적지 않을까요?
    Asp.Net Core 는 자체로 Kestrel 서버에 임베드되어 있기 때문에 내부망 정도에서는 아무런 무리가 없습니다.
    웹앱이 UI를 제공하기 때문에 WPF가 필요하지는 않을 것 같습니다.

  2. 웹 UI 작성에 익숙치 않고, 서버가 주로 데이터만 주고 받는다면,
    Asp.Net Core Web Api 앱을 별도로 작성해서 돌리고, WPF는 이 서버에 대한 클라이언트로 동작하는 것이죠. API 서버에서 뭘 받아 오려면, HttpClient 객체를 사용하면 됩니다.

  3. WPF 가 다른 기능을 이미 보유하고 있어서, 무조건 필요한 경우,
    무거운 Asp.Net 프레임워크 전부를 가져다 쓰는 것보다, HttpListner 클래스를 통해 Http 서버 기능만 구현하는 방법도 있습니다.
    HttpListener Class (System.Net) | Microsoft Learn
    아시겠지만, 리스닝을 무한 반복하는 게 서버의 본질입니다.
    WPF에서 스레드를 생성하고, 그 안에서 리스닝을 무한 반복하게 만들면 서버 스레드가 되는 것이죠.
    각 서버 스레드가 연결 리스트 형식의 Request 처리자를 호출하면, Request Pipeline 이 되는 것이죠.
    이는 Asp.Net Core의 미들웨어가 사용되는 방식과 동일합니다.
    이 경우, WPF UI 스레드, 서버 스레드, 요청 파이프 라인은 동일 Process 에서 돌아 가기 때문에 코드 공유를 할 수 있어, 통신이 간편하다는 장점이 있습니다.

  4. 만약 서버를 내부망 뿐만 아니라 외부망(인터넷)에도 노출해야 하는 상황이라면,
    Asp.Net Core 웹앱으로 정식 호스팅 하는 것이 좋을 것 같습니다.
    이 경우도 WPF 앱은 클라이언트가 됩니다.

2개의 좋아요

의견 감사드립니다.

WPF는 그나마 경험이 조금 있는데, Asp .NET Blazor 등 프론트 기술들은 완전 처음이라 부담이 됩니다.

빌드서버에서 전달되는 정보를 가지고 로컬에서 개발보드 제어를 하려고 하는거라
Smemo 처럼 작은 핸들 달린 패널 윈도우에 버튼 몇개 배치하려고 합니다.

무엇보다 웹앱을 작성할거였으면 그냥 Electron을 알아봤을 것 같습니다ㅎㅎ

파이썬에는 Bottle 같은 경량 웹 프레임워크가 있는데, C# 에는 ASP .NET이 버티고 있어서인지 찾기 쉽지 않고 대부분 ASP .NET Core를 이용하라고 하길래 알아보다 여기까지 오게 되었습니다.

2개의 좋아요

@Code_Pasta 좋은 질문입니다. 저도 과거에 찾아본 기억이 있지만, 아마 앞으로도 찾아보시는 분들이 계실거에요. :smile:

1개의 좋아요

백앤드 asp.net core web api 프로젝트 + worker 서비스

프론트앤드 wpf _+ sgnalr

하면 될듯…

2개의 좋아요

이건 제가 만든 클래스에요. 일상적인 ASP.NET CORE 의 Starup.cs 과 동일한 역할을 합니다. 내용도 유사합니다.

2개의 좋아요

HttpListenerClient ! 와우! 새로운 인사이트를 얻어 갑니다. 다음에 꼭 써먹어 봐야겠어요.
옛적에 TcpSocket 으로 80 포트 열어서 브라우져로 접속 시켰던 기억이 나네요! 그땐 헤더 분기랑 Multipart 분기 하기 정말 까다로웠는데…

3개의 좋아요