unoplatform / uno

Open-source platform for building cross-platform native Mobile, Web, Desktop and Embedded apps quickly. Create rich, C#/XAML, single-codebase apps from any IDE. Hot Reload included! 90m+ NuGet Downloads!!
https://platform.uno
Apache License 2.0
9.08k stars 738 forks source link

I cannot deploy WASM to IIS #16015

Open TopperDEL opened 8 months ago

TopperDEL commented 8 months ago

Current behavior

I have multiple problems. Either the publish fails with "file is locked" or the published app is not accessable or - the current error - it states that "there is no target for net8.0/win-x64".

I'll start with the "no target"-error: msbuild.zip

This is a follow-up-issue from #14637 .

Expected behavior

The deploying of a freshly created WASM-app to IIS should work.

How to reproduce it (as minimally and precisely as possible)

No response

Workaround

None, yet

Works on UWP/WinUI

Yes

Environment

No response

NuGet package version(s)

No response

Affected platforms

WebAssembly

IDE

Visual Studio 2022

IDE version

No response

Relevant plugins

No response

Anything else we need to know?

No response

TopperDEL commented 8 months ago

I just created a new app, tried Windows (works), tried WASM locally (works), created a publish profile and tried to publish and got the "IISDEployTest.Wasm.dll is used by another process".

The binlog for this error (it is a different project then the above!) is here: msbuild.zip

TopperDEL commented 8 months ago

Now I managed to get a deployment working. The site in IIS now looks like this:

image

It feels like the site is using the wrong directory. But as mentioned in #14637 I see no other way to create a site and deploy to it.

Comparing it to another - older - app built with Uno, the web.config is found in the root dir while the new one does not deploy one. The new ony only puts a web.config in the subfolder "wwwroot". But besides that I see no difference in configuration.

TopperDEL commented 8 months ago

Ok, I just realized, that the template also creates a server project that serves the WASM-App, too. So I do not need to deploy the WASM-project itself but I can simply deploy the Server-project. That works flawlessly as expected!

So if this is the way to go, then I'm fine. If WASM still should be deployable by its own (what I assume, though), the above errors are still there.

But for me, the server-project is good enough and works!

Sometimes I'm wondering about myself: I'm following Uno-development very closely and read every news and blog post. But I seemed to miss this one.

jeromelaban commented 8 months ago

Thanks for the update @TopperDEL. The wasm project should be deployable indeed. I may have missed this, but did you try using dotnet publish from the command line?

TopperDEL commented 8 months ago

Yes, I did. But it lead to nearly the same issue - though I'm not quite sure if it was due to missing password or so. So maybe the reason for failing deploy was different.

TopperDEL commented 6 months ago

I just stumbled across this problem again. I could not publish the WASM-Head to IIS. Then I tried to do it using the terminal and dotnet publish. That lead me to an issue: I have one main uno-app (already on 5.2) that is using central package management. The app I would like to deploy now is in a subfolder of the other app and is on Uno 5.1 and is NOT using central package management. But if I do not define that explicitly, it finds the Directory.Packages.propsfrom the 5.2-app and I got the error that I must not define the package version when using the central package management. I could overcome this by explicitly set <ManagePackageVersionsCentrally>false</ManagePackageVersionsCentrally> in the "sub-uno-project".

Then the publish with dotnet publish worked, but I still cannot access the app. "You are not allowed to access the directory or page". I think there is some web.config-setting missing now. I am still unable to publish it using Visual Studio. There the publish fails with "project.assets.json does not contain a target for net8.0/win-x64" (NETSDK1047).

TopperDEL commented 6 months ago

After adding <RuntimeIdentifiers>win-x64</RuntimeIdentifiers> to my WASM-head I could deploy it, but still have issues with the app not being accessable. I think I'm missing some mime-types or so in the ISS-site-config.

What really confuses me is this doc. I do not know how to set the physical path. If I create a site I need to define which folder it uses. Then I deploy the app and would expect the folder to contain the app itself - not necessarily in a subfolder. So there is no other way to "set a physical path" to another subfolder of my site.

TopperDEL commented 6 months ago

Now I got it! the physical path of my site can be changed in the "extended settings". There I simply have to set it to the "wwwroot"-folder underneath my site-path.

Now it is working as expected! I can deploy and the site is accesable again!

I would suggest to update the doc, though. The physical path has to be set to "wwwroot", not to any "dist"-folder.

TopperDEL commented 6 months ago

Sorry, I have to re-open this.

Every consecutive deploy now writes below the "wwwroot"-physical path in IIS. So changing the physical path for the site is not the way to go.

I create a new site: c:\inetpub\wwwroot\myapp\

I deploy my site using VS: c:\inetpub\wwwroot\myapp\wwwroot

I change the physical path and re-deploy - making the app unusable again: c:\inetpub\wwwroot\myapp\wwwroot\wwwroot

The problem is: I need a web.config in the myapp-folder that configures the redirection to the wwwroot. This should be created by the deployment-task - or the deployment should not create a "deeper" path (appending "wwwroot").

jeromelaban commented 6 months ago

Thanks for the updates. Could you create a step-by-step repro scenario that shows the issue? I'm also wondering if it's something that got fixed in 5.2 somehow with the single project.

TopperDEL commented 6 months ago

So @jeromelaban, I just made an end-to-end-test and collected all steps I've done.

First, let's create a new app: dotnet new unoapp -o iistest

And create a new site in IIS: image

Then I started win-head => working I started wasm (iis express) => not working (obscure error) I started wasm => working I started wasm (iis express) => working (maybe the first run needs some initialization? - whatever)

Let's create a publish profile: image image image

Started the deployment=> it fails with “…\iistest\obj\Release\net8.0-browserwasm\iistest.dll” is already in use by another process Cleanup solution, deploy again => same error Cleanup solution, closing VS, open Solution again, deploy again without any building in between => successful deployment

image

BUT: the website is not available:

image

“You are not allowed to view this folder or site” The reason: there is no document to serve in the root-folder of the IIS-site:

image

Now if I change the physical path of the site from this:

image

To this:

image

It works:

image

Now let’s deploy again from VS (cleanup, closing, re-opening, deploying) – we then get another wwwroot underneath the “iistest\wwwroot”-folder and we don’t get the latest version served from IIS (as that one is one folder deeper). The folder structure now looks like this:

image

This is exactly the error I get all the time. It seems the deployment has a wrong "ground" to start. Why does it create another wwwroot underneath my site-path? It should just deploy all files at the root. I cannot overcome this by chaning the physical path of the site as every subsequent deploy would again create a new wwwroot underneath.