Mono

De Banane Atomic
Version datée du 19 juillet 2017 à 15:57 par Nicolas (discussion | contributions) (→‎Liens)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à la navigationAller à la recherche

Liens

Compatibilité avec .NET

  • MVC4 et MVC5 - non supporté (Partial, no async features supported)

Compilation

Bash.svg
# compilation du fichier MyClass.cs avec une référence à l'assembly System.Web
mcs MyClass.cs /r:System.Web

SSL / TLS

SSL permet le chiffrement des données, mais utilise aussi un certificat pour s'assurer de l'identité du site destinataire.
SSL utilise des certificats X.509 liant un site à une clé publique. Les certificats sont délivrés par une Autorité de Certification.
Par défaut Mono ne contient aucun certificat et ne fait donc confiance à aucun site.

SSL / TLS in Mono

Certificats

Bash.svg
# liste les certificats de l'utilisateur courant pour Mono
certmgr -list -c Trust

# liste les certificats de la machine pour Mono
certmgr -list -c -m Trust

# importez les certificats dans l'emplacement des certificats Mono de l'utilisateur courant
# mise à jour stricte (ajouts et suppressions)
mozroots --import --sync
# demande confirmation avant la suppression d'un certificat
mozroots --import --ask-remove

Décompilateurs

ILSpy, .NET CodeReflect, .NET CodeReflect, JustDecompile, dotPeek utilisent WPF et ne fonctionnent donc pas sous Mono

Interop with Native Libraries

MonoDevelop

Chemins vers les DLL

  • /usr/lib/mono/4.5
  • /usr/lib/mono/4.0
  • /usr/lib/mono/2.0
  • /usr/lib/monodevelop/bin

ASP.NET

Nginx et FastCGI

Bash.svg
# installation de XSP: un serveur web léger, idéal pour réaliser des tests avec Mono et ASP.NET
sudo pacman -S xsp

# lancer le serveur fastcgi
fastcgi-mono-server4 /applications=asptest.domaine.fr:/:/srv/http/asptest/ /socket=tcp:127.0.0.1:9000
# hostname: asptest.domaine.fr
# virtual root: /
# physical path: /srv/http/asptest/
asptest.conf
server {
  listen        80;
  server_name   asptest;
  root          /srv/http/asptest;

  error_log     /var/log/nginx/asptest_error.log;

  location / {
    index           index.html index.htm default.aspx Default.aspx;
    fastcgi_index   Default.aspx;
    fastcgi_pass    127.0.0.1:9000;
    include         /etc/nginx/fastcgi_params;

    fastcgi_param  PATH_INFO          "";
    fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
  }
}
/etc/systemd/system/fastcgi-mono-server4.conf
[Unit]
Description=FastCGI mono server 4 for the healthmanager web site
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/fastcgi-mono-server4 /applications=asptest.domaine.fr:/:/srv/http/asptest/ /socket=tcp:127.0.0.1:9000 /logfile=/var/log/mono/fastcgi.log
ExecStop=/usr/bin/kill $MAINPID

User=http
Group=http


[Install]
WantedBy=multi-user.target

MVC

mvctest.conf
  location / {
    # Pas d'index car MVC s'occupe du routing
    #index           index.html index.htm default.aspx Default.aspx;

    # et index fast cgi directement à la racine du site
    fastcgi_index   /;

Apache

Use mod_mono, a module that allows Apache to serve ASP.NET applications.

Bash.svg
sudo pacman -S mod_mono
/etc/httpd/conf/httpd.conf
Include conf/mod_mono.conf
/etc/xsp/xsp.webapp
<apps>
  <web-application>
    <name>Root</name>
      <vpath>/</vpath>
      <path>/srv/http/html/xsp</path>
      <vhost>localhost</vhost>
  </web-application>
</apps>
Bash.svg
# lancer le server
xsp4

The resource cannot be found

Lancez le serveur dans le répertoire contenant l'application web.

Code inline

Asp.svg
<%@ Page Language="C#" %>

<script runat="server">
private void btnOkClicked(object sender, EventArgs e)
{
  name.InnerHtml = tbName.Text;
  tbName.Text = "";
  tbName.Focus();
}
</script>

<!DOCTYPE html>
<html>
<head runat="server">
  <meta charset="UTF-8" />
  <title>Hello</title>
</head>

<body>
  <p>
    Hello <span id="name" runat="server"></span> !!!
  </p>
  <form id="form1" runat="server">
    <asp:TextBox id="tbName" runat="server"></asp:TextBox>
    <asp:Button id="btnOk" runat="server" Text="Ok" OnClick="btnOkClicked" />
  </form>

Code behind

Hello.aspx
<%@ Page Language="C#" Inherits="WebForms.Hello" %>
Hello.aspx.cs
using System;
using System.Web;
using System.Web.UI;

namespace WebForms
{
  public partial class Hello : System.Web.UI.Page
  {
    protected System.Web.UI.HtmlControls.HtmlGenericControl name;
    protected System.Web.UI.WebControls.TextBox tbName;

    public void btnOkClicked(object sender, EventArgs e)
    {
      name.InnerHtml = tbName.Text;
      tbName.Text = "";
      tbName.Focus();
    }
  }
}
Il faut compiler le fichier Hello.aspx.cs sinon on obtient l'erreur Cannot find type WebForms.Hello
mcs /target:library Hello.aspx.cs /r:System.Web /out:bin/Hello.aspx.dll

Web.config

Web.config
<?xml version="1.0" encoding="utf-8"?>

<configuration>
  <system.web>
    <customErrors mode="Off"/>
  </system.web>
</configuration>

Erreurs

Cannot find type xxx.Global

Error parsing a resource required to service this request. Cannot find type xxx.Global

Le dossier bin doit se trouver au niveau du DocumentRoot.

System.UnauthorizedAccessException: Access to the path "/srv/http/.mono" is denied

(info) Auto generated encryption keys not saved: 
System.Security.SecurityException: No access to the given key ---> 
System.UnauthorizedAccessException: Access to the path "/srv/http/.mono" is denied.

Créez le dossier /srv/http/.mono et le rendre accessible en écriture pour l'utilisateur http.

500 No Application Found

Le serveur FastCGI fastcgi-mono-server n'est pas lancé.

Could not find file "/srv/http/WebApplicationMVC/bin\roslyn\csc.exe"

Les backslash posent problème.

Bash.svg
MONO_IOMAP=all fastcgi-mono-server4 /applications=asptest.domaine.fr:/:/srv/http/asptest/ /socket=tcp:127.0.0.1:9000

No process is associated with this object

Moonlight

Plus maintenu.

WPF

Pas d'implémentation de WPF pour Mono pour l'instant. Source