aspnetcore
aspnetcore copied to clipboard
Support for MAUI runtimes in ASP.NET Core?
Hey,
I apologize in advance if this is not the correct place to ask this, but I didn't find any better one. Feel free to move this issue if appropriate.
For testing purposes, in MAUI net6.0-android
project I've tried to reference other project of mine targetting net6.0
which is a library. I didn't have any issues doing so, but during compilation I've stumbled upon following error:
Error NETSDK1082 There is no Microsoft.AspNetCore.App runtime package available for the specified RuntimeIdentifier "android-x86"
If I understand this right, I can reference standard net6.0
projects because Microsoft.NETCore.App.Runtime.Mono.android-x86
exists and is usable, at least I successfully did that with example net6.0
library. However, I'd like to reference a library that has actual ASP.NET Core elements (Kestrel web server, API with MVC etc), which according to the error is impossible because it can't find a required android-x86
runtime, which seems to be correct as of today.
Now I apologize if I'm trying to do some extreme stupidity, or I don't understand something, but I wanted to verify whether it'd be possible to "convert" existing CLI project of mine which uses Kestrel and API controllers into an Android MAUI app that could start the "backend" part on the target machine, with some nice frontend utilizing those API endpoints over HTTP. I'm testing this in .NET 6.0 preview 6 if it matters.
Is this possible/planned? Or perhaps I'm doing something horribly wrong?
In any case, thank you in advance for answering, I appreciate it.
(Transferring back to aspnetcore repo...)
Hi @JustArchi , code that is specific to ASP.NET Core scenarios, such as hosting Kestrel, requires platform support, which as you discovered, it not available on some platforms, such as Android.
I think this might really be a question for the ASP.NET folks as to whether there is a desire to support certain features, such as Kestrel, on "arbitrary" platforms, or whether to specifically add support to particular platforms (e.g. android-x86).
Hosting a local web server in a cross-platform app is something reasonable (though perhaps not super common), so it's worth considering.
For right now I'm not aware of any plan to support this.
Tagging @danroth27 because I think you mentioned something about this the other day.
Thanks for your answer @Eilon, I appreciate it.
Hosting a local web server in a cross-platform app is something reasonable (though perhaps not super common), so it's worth considering.
Yeah I definitely don't see everybody jumping on this idea right away and bundling every Android/iOS/etc app with a local web server, but I also came to conclusion that it's something reasonable enough to at least suggest/evaluate on. I have no idea how much work would be required to bring ASP.NET Core runtime to those new .NET 6.0 platforms, but if it helps in any way then I'd be definitely interested in making use of such functionality, at least for that one use case I have in mind.
It could also be a decent alternative if somebody wanted to build an app that looks more like a typical website to you. To give you some idea, I have a CLI app realizing its functionality with bundled Kestrel web server and MVC APIs, which is not really any different from a typical ASP.NET Core website, but it's more of the CLI app and APIs are just an extra. Anyway, I bundle that app with frontend written in html/css/js (static files that Kestrel serves), which results in user navigating to his localhost
app address, where he can control the app through a website interface (that calls appropriate API endpoints).
As an experiment I tried to convert this "idea" into Android app, where the app could create a very simple Webview
with that localhost
address (where the frontend is already mobile-aware), while launching the backend part the same as on all other OSes I build this for. This in result failed as of today, since there is no ASP.NET Core runtime for Android (which is just an example platform I tried to test it on).
I'm describing that just to give you some insight into what this whole "feature request" could be useful for, while MAUI is great on its own and building new apps is definitely going to be interesting, there might be more of such CLI apps with some kind of web interface that could easily be converted into Android apps without much hassle if just the ASP.NET Core runtime was available to make use of. It's not like my app requires something more than a web server with static files and MVC APIs anyway.
In any case thank you in advance for evaluation of this idea, perhaps it could be something to think of for the future.
@davidfowl feel free to update the label. This seems to be the closest match.
@JustArchi to second your "reasonable scenario" statement.
We are actually started using local GRPC (client and server) in our current Xamarin app as an IPC technology to communicate between two apps.
We have some LOB-concerns which forces us to do a lot (and kinda complex) local IPC between our app and a third party app.
And to use one identical API technology on all Platforms targets (Android, iOS and Windows) we've chosen grpc.
I've got the "same" problem. I'm trying to add DI to my maui app using the idea James wrote here https://montemagno.com/add-asp-net-cores-dependency-injection-into-xamarin-apps-with-hostbuilder/ And then I get the error:
NETSDK1082 There was no runtime pack for Microsoft.AspNetCore.App available for the specified RuntimeIdentifier 'iossimulator-x64'. Sample.Mobile.Maui C:\Program Files\dotnet\sdk\6.0.100-rc.2.21505.57\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.FrameworkReferenceResolution.targets 427
The same goes for maccatalyst-x64
, android-x86
and linux-arm
.
I created a mauilib with the default structure:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net6.0-ios;net6.0-android;net6.0-maccatalyst</TargetFrameworks>
<!-- <TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows')) and '$(MSBuildRuntimeType)' == 'Full'">$(TargetFrameworks);net6.0-windows10.0.19041</TargetFrameworks> -->
<TargetPlatformMinVersion Condition="$(TargetFramework.Contains('-windows'))">10.0.17763.0</TargetPlatformMinVersion>
<UseMaui>true</UseMaui>
<SingleProject>true</SingleProject>
<SupportedOSPlatformVersion Condition="'$(TargetFramework)' == 'net6.0-ios'">14.2</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="'$(TargetFramework)' == 'net6.0-maccatalyst'">14.0</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="'$(TargetFramework)' == 'net6.0-android'">21.0</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$(TargetFramework.Contains('-windows'))">10.0.18362.0</SupportedOSPlatformVersion>
</PropertyGroup>
<ItemGroup>
<Folder Include="Platforms\iOS\" />
<Folder Include="Platforms\Windows\" />
<Folder Include="Resources\Fonts\" />
<Folder Include="Resources\Images\" />
</ItemGroup>
</Project>
I tried recreating the projects twice from the command line, but it still won't work. dotnet new maui
and dotnet new mauilib
.
Is there a workaround for this? I'd very much like to be able to use DI, but I'm blocked as is.
Checking up the nuget repository, I found the references, but for .Mono. Is there something I'm doing incorrectly?
@eestein .NET MAUI already has support for dependency injection built-in. MauiAppBuilder
exposes a Services
property that you can use to configure your services. You shouldn't need to add any additional dependencies.
@danroth27 thanks, I appreciate you taking the time to evaluate my question. The thing is, I'm not adding anything extra.
This is the info for my maui lib.
These are my usings:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Maui.Hosting;
These are the only nuget packages I've got installed:
These are the dependencies:
This is my csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net6.0;net6.0-ios;net6.0-android;net6.0-maccatalyst</TargetFrameworks>
<Nullable>enable</Nullable>
<UseMaui>true</UseMaui>
<SingleProject>true</SingleProject>
<SupportedOSPlatformVersion Condition="'$(TargetFramework)' == 'net6.0-ios'">14.2</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="'$(TargetFramework)' == 'net6.0-maccatalyst'">14.0</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="'$(TargetFramework)' == 'net6.0-android'">21.0</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$(TargetFramework.Contains('-windows'))">10.0.18362.0</SupportedOSPlatformVersion>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Sample.Data\Sample.Data.csproj" />
</ItemGroup>
</Project>
And I still get the error:
/usr/local/share/dotnet/sdk/6.0.100-rc.2.21505.57/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.FrameworkReferenceResolution.targets(427,5): error NETSDK1082: There was no runtime pack for Microsoft.AspNetCore.App available for the specified RuntimeIdentifier 'iossimulator-x64'. [/Users/eestein/Documents/dev/smp/sample-repo/Sample/Sample.Mobile.Maui/Sample.Mobile.Maui.csproj]
I'm not trying to waste anyone's time here, believe me when I tell you I research a lot before asking. The thing is I'm stuck on this one since yesterday. Before trying many things I found online I recreated the projects twice and they still won't work. I tried recreating from VS2022 and also from the command line on my macOS. I still get the error when I reference my mauilib from the maui app.
Why did you include ASP.NET Core if you're only trying to use dependency injection?
@davidfowl I didn't... I just created the maui lib using the provided template. And, I also tried removing that framework, I just couldn't find a way to do so.
I do need to use HttpClient, though
@eestein is that the CSPROJ of the project that's failing, /Users/eestein/Documents/dev/smp/sample-repo/Sample/Sample.Mobile.Maui/Sample.Mobile.Maui.csproj
? Is there any other .targets
or .props
file or a global.json
that might be affecting things?
@Eilon let me take a closer look and I'll get back to you on that. Thanks.
I'm also looking for specific packages that could be adding the FW.
Maybe it's the SampleData project reference?
A plain dotnet new mauilib
should not reference AspNetCore in any way, so something else is bringing it in.
Thank you, gentlemen! @davidfowl your comment made me realize there was one specific thing I hadn't tracked. The problem was that one of the libs had a reference to FluentValidations.AspNetCore instead of FluentValidations. That's what was loading the aspnetcore FW.
I'm sorry to have wasted your time. But I also think, if possible, a better error message could be provided. If in the message we could see the offending library, that would help a lot!
Thank you all, @danroth27 , @Eilon and @davidfowl
Please consider my suggestion for the error message.
Come on guys and gals, GRPC is THE strongly advertised tech from MS for IPC and SOA. You really need to bring asp.net to Net 6 (Xamarin) iOS and Android Runtimes.
In the end, that was the promise MS made, one runtime for all Platforms, not: your lib might only run on one or two Net 6 runtimes (bot not on ios or android or uwp).
Today we can still use the "Grpc.Core" Server wich works without asp.net, but this will be deprecated in the near future.
rpc-dotnet (the Grpc.Net.Client and Grpc.AspNetCore.Server nuget packages) is now the recommended gRPC
implementation for .NET/C#. The original gRPC C# implementation (the Grpc.Core nuget package)
https://grpc.io/blog/grpc-csharp-future/
I am quite confused why this is still not supported. I already use the Kestrel webservice in my Xamarin app for a while. It seems that Microsoft.AspNetCore
(v2.2.0) works fine in Xamarin and probably will work in MAUI too. Later versions don't work anymore, because they are not available as separate packages. I never understood why an application that exposes a web-service should be treated so special (I don't know of any other language that does this). ASP.NET core was just a bunch of packages with .NET core v2.2 and it worked fine.
I tested it with iOS, Android and UWP applications without any issues. I was hoping that MAUI and .NET 6 would really bring us one .NET.
Hi folks. I'd like to collect some more details on the specific scenarios for using ASP.NET Core in a mobile app. So far from the feedback in this issue I've identified two scenarios:
- Building a mobile app as a locally hosted web app (https://github.com/dotnet/aspnetcore/issues/35077#issue-962146241)
- IPC between apps using gRPC (https://github.com/dotnet/aspnetcore/issues/35077#issuecomment-908238983)
Anything else?
@danroth27 thanks for taking a look into this.
Additional to #35077 there is local network GRPC planned. For example:
- GRPC call from a smartwatch to mobile-phone
- GRPC call from a pc to a mobile phone
tl/dr:
- case "smartwatch -> mobile" : ad-hoc controlling the app temporarily, when you need your hands and cannot hold the mobile phone at the moment; afterwards continuing on the phone
- case "pc -> mobile phone": use the convenience of a keyboard and big screen to enter data and review the result of the data collected with the mobile phone
It all boils down to one person continuously switching between 3 devices (mobile phone, pc, smartwatch) to do its work. Functionality/state which is held on one "main" device (usually mobile phone), and depending the circumstances is controlled by phone itself, smartwatch, pc.
Usually you would do that with a central server/could service holding the state/functionality. For privacy and ease of configuration reasons, we are bound to the solution of no-server/cloud solution, where the "main" device holds the state.
Hi folks. I'd like to collect some more details on the specific scenarios for using ASP.NET Core in a mobile app. So far from the feedback in this issue I've identified two scenarios:
- Building a mobile app as a locally hosted web app (Support for MAUI runtimes in ASP.NET Core? #35077 (comment))
- IPC between apps using gRPC (Support for MAUI runtimes in ASP.NET Core? #35077 (comment))
Anything else?
This absolutely wonderful, thinking about a fully functioning backend web server (restful api, gRPC, signalR, database etc.) working with WebView, this gonna change the way people build mobile apps!!!
Really looking forward to this.
Putting this on the @dotnet/aspnet-blazor-eng radar. This is not really a general area-infrastructure
issue.
@dougbu I’m not sure why this is marked a Blazor issue. It has nothing to do with Blazor. When you read my comment from December 7, then I try to explain that it is a fundamental .NET issue, because Kestrel isn’t an ordinary package anymore, but considered a “platform”. It”s not a real MAUI issue, but a fundamental ASP.NET issue.
We implemented a Kestrel based webserver (using ancient Kestrel package from the .NET Core 2.2 era) and have an Angular client on top of it. It works great, but not being able to upgrade Kestrel is not a sustainable solution.
This is area-runtime
as it is about being able to use <FrameworkReference Include="Microsoft.AspNetCore.App" />
within a Maui application.
Thanks @ramondeklein and @javiercn for clearing up my confusion
I'm actually not sure this belongs in runtime 😄
@davidfowl well... it's about kestrel... 😄
Hi folks. I'd like to collect some more details on the specific scenarios for using ASP.NET Core in a mobile app. So far from the feedback in this issue I've identified two scenarios:
@danroth27 Thank you very much for giving this attention. I've run into this in these scenarios:
-
I've made a controlpanel for starting, stopping, setting port, getting messages etc. for a local webserver made with Kestrel and Minimal api in MAUI. I was hoping that it would be cross platform, so I could use it on Mac Desktop, but using Sdk="Microsoft.NET.Sdk.Web" tells me that this is a no go on Catalyst becasue of There was no runtime pack for Microsoft.AspNetCore.App available for the specified RuntimeIdentifier 'maccatalyst-x64' The usecase here is "Make a crossplatform (local) server with GUI control"
-
I tried to build my Controlpanel+server in Blazor WASM, but got a similar error. The usecase here is "Build and distribute an API that can run on client computer without install"
-
Quite a few IOS apps use local servers for sharing files with desktop computers on the same network. It's a really simple and nice way to share data. The usecase here is "Share data from App on local network via http"
-
Expose a "Control panel" for a mobile app. Start/stop/Record/Pause/Take photo etc. The usecase here is "Expose a web GUI interface on the local network to control an app"
@davidfowl wrote
I'm actually not sure this belongs in runtime 😄
If this means making Kestrel usable without the breaking dependencies , +1000 thums up :-)
@danroth27 For us the requirement would be to wrap an SPA that talks to an backend together with that backend into a desktop application. On Windows that is not a problem, but this application should also work on a Mac, so MacCatalyst should be supported.
The embedded backend should be able to provide http Endpoints for the SPA running in a MAUI Webview, so that the SPA app can access the local backend, as well as provide support for EF Core so that the standalone desktop version can connect to a database (which would require to open a TCP connection, which also does not work on the iOS-App-wrapped-in-catalyst at the moment.
For the moment Windows and Mac-Desktop are the main targets, Linux would be awesome. Mobile (iOS / Android) not so much.
Plan B would be to use an electron host that could launch the API as another process, but when we are not within the same application it's way more complicated to TLS the api access without running into several self-signed certificate issues.
Exposing a real TCP listener in your app can be problematic for multiple reasons (listeners may be blocked by local firewall-type tools, and it's difficult to be sure that you're not processing requests from unsanctioned 3rd-party processes running on the same machine). If at all possible I'd recommend setting up a different, non-HTTP communication channel from your JS code to the hosting .NET application. That's how BlazorWebView works, and can be achieved using the web view's JS interop APIs.