Hi, I’m very interested in using WiseJ for the Dashboard of a embedded systems project (to replace a legacy VWG application).
The questions that I have are:
1) At the moment, the resulting (ASP.NET?) published files only appear to be able to be run using IISExpress/IIS, would it be possible to have a WiseJ application run by an more embedded web-server such as:
I notice that WiseJ currently does not run using the Visual Studio Development Server, which explains why it also doesn’t run using Cassini/UltiDev.
2) Would a licensing model for this setup be considered? As basically, each unit would have a separate micro web server running on them so as far as I can tell there is no mention of this type of licensing on the forum?
There are other minority uses where we could use ISSExpress/IIS to server WiseJ, but the main thrust of our use with WiseJ (should this be possible) would be with embedded systems.
Regards,
Mark
To update this thread, Wisej now can run as a fully self hosted process or service based on OWIN/Katana and it can also run as a standalone desktop application using either IE or Chromium. In both cases it’s a single executable that doesn’t require to be installed.
Wisej Self Hosting also works perfectly with Docker Containers, and with NGINX or Apache as reverse proxies and/or load balancers. NGINX or Apache can run on linux machines, while Wisej processes (or docker contaners) run on Windows machines, including Windows Nano.
https://wisej.com/blog/self-hosting-and-standalone-web-apps/
Hi Luca,
Thanks for the reply regarding Linux. It is a shame the mono platform isn’t capable of self-hosting a WiseJ application in it’s current state, as this would be a great bonus. But I do understand there is nothing much you can do from your perspective.
Certainly, there is partial scope to run the WiseJ application on a Windows machine and utilize the APIs from the linux devices. This would work quite well, apart from the case where we would have liked to use the WiseJ application to “initially configure (e.g. including networking)” the linux device.
For other purposes we are very excited from our trials of WiseJ on Windows machines, and we are already planning solutions utilising WiseJ in these areas.
Regards,
Mark
Hi Luca,
The self-hosting and stand-alone techniques work really well, impressive!
Just one question, although I’ve seen the mention of using nginx as revese proxy to enable the self-hosting to work under linux – what setup is required for this to work?
In other words last time I checked mono was still not supporting websockets, therefore can you elaborate (or link) to the steps necessary to get this setup running under a recent linux distribution?
Apart from the linux issue, loving the self-hosting. As with WiseJ in general, just seems to work :o)
Regards,
Mark
Hi Luca,
Thanks, I have it working now. Yes, it was just a bit of XML blindness in the web.config that I didn’t catch when you posted it originally. Now working fine.
Just for a heads up, I copied the published files across to a embedded debian system running mono + xsp4. Although it attempted to run, it did fail to start with a:
“Missing method System.Web.HttpContext::get_IsWebSocketRequest()” – which looks like it is still missing out of the current mono source. So what you mentioned earlier about compatibility with mono is true at the current time.
Regards,
Mark
The problem is web.config. It seems that you changed the handlers and modules inside system.webserver. That’s for the integrated pipeline and it’s not recognized by cassini. The classic pipeline settings are in system.web:
<?xml version=”1.0″?>
<!–
For more information on how to configure your ASP.NET application, please visit
http://go.microsoft.com/fwlink/?LinkId=169433
–>
<configuration>
<appSettings>
<add key=”Wisej.LicenseKey” value=””/>
<add key=”Wisej.DefaultTheme” value=”Blue-1″/>
</appSettings>
<system.web>
<httpRuntime targetFramework=”4.5″ maxRequestLength=”1048576″/>
<compilation debug=”true”></compilation>
<httpHandlers>
<add verb=”*” path=”*.wx” type=”Wisej.Core.HttpHandler, Wisej.Core” validate=”false”/>
<add verb=”*” path=”*.wx/*” type=”Wisej.Core.HttpHandler, Wisej.Core” validate=”false”/>
</httpHandlers>
<httpModules>
<add name=”Wisej” type=”Wisej.Core.HttpModule, Wisej.Core”/>
</httpModules>
</system.web>
<system.webServer>
<modules>
<add name=”Wisej” type=”Wisej.Core.HttpModule, Wisej.Core”/>
</modules>
<handlers>
<add name=”wisej” verb=”*” path=”*.wx” type=”Wisej.Core.HttpHandler, Wisej.Core”/>
</handlers>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength=”1073741824″/>
</requestFiltering>
</security>
<defaultDocument enabled=”true”>
<files>
<add value=”Default.html” />
</files>
</defaultDocument>
</system.webServer>
</configuration>
Hi Luca,
I’m just using the project from this thread:
https://wisej.com/support/question/animated-gif-in-picturebox
This is the web.config:
<?xml version=”1.0″?>
<!–
For more information on how to configure your ASP.NET application, please visit
http://go.microsoft.com/fwlink/?LinkId=169433
–>
<configuration>
<appSettings>
<add key=”Wisej.LicenseKey” value=””/>
<add key=”Wisej.DefaultTheme” value=”Blue-1″/>
</appSettings>
<system.web>
<httpRuntime targetFramework=”4.5″ maxRequestLength=”1048576″/>
<compilation debug=”true”>
<assemblies>
<!–
Add additional components here:
<add assembly=”Wisej.Web.Ext.JustGage”/>
–>
</assemblies>
</compilation>
</system.web>
<system.webServer>
<modules>
<add name=”Wisej” type=”Wisej.Core.HttpModule, Wisej.Core”/>
</modules>
<handlers>
<add verb=”*” path=”*.wx” type=”Wisej.Core.HttpHandler, Wisej.Core” validate=”false”/>
<add verb=”*” path=”*.wx/*” type=”Wisej.Core.HttpHandler, Wisej.Core” validate=”false”/>
</handlers>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength=”1073741824″/>
</requestFiltering>
</security>
<defaultDocument enabled=”true”>
<files>
<add value=”Default.html” />
</files>
</defaultDocument>
</system.webServer>
</configuration>
I must be doing something daft :o(
Can you send me your web.config or the complete test peoject?
The stack trace shows that the wisej handler is not invoked.
Hi Luca,
I’ve tried to run a re-published test project with Ultridev as you have shown above and no matter what I try I still get 404 on the .wx file.
http://127.0.0.1/wisej/wisej.wx 404 (Not Found)
I am running on a x64 Win7 machine, not sure if that makes any difference. Here is all I can get out of UltiDev log.
******** Starting hosting “C:\Temp\wisej” ********
01:26:41.0613 PM Created ASP.NET AppDomain (AppDomain ID={7048dff9-986e-42fc-8ea1-dcce3540d418}) for application “” (Application ID={7b92eb88-f419-4385-b0ae-06a25afda260}).
Environment info: Command line: “C:\Program Files (x86)\UltiDev\Web Server\UWS.InteractiveServer.Clr4AnyCPU.exe”
Process ID: 900
Process user name: Mark-PC\Mark
Bitness: 64
CLR version 4.0.30319.42000
Process retired: False
Max request threads: 800
Max I/O threads: 800
01:26:41.1873 PM Starting accepting requests for “C:\Temp\wisej\” (AppDomain ID={7048dff9-986e-42fc-8ea1-dcce3540d418}).
01:26:49.5018 PM @@@@ LT [00000000-0000-0000-2300-0080000000FE] for /wisej/: Got context from this.listener.EndGetContext(ar);
01:26:49.5018 PM @@@@ LT [00000000-0000-0000-2300-0080000000FE] for /wisej/: Entered HandleRequest(requestContext);
01:26:49.5028 PM Received GET request of size 0 for: “/wisej/”.
01:26:49.5088 PM @@@@ LT [00000000-0000-0000-2300-0080000000FE] for /wisej/: Entered ApplicationRequestDispatched.ProcessRequest(), about to construct AspNetRequest object.
01:26:49.5128 PM @@@@ LT [00000000-0000-0000-2300-0080000000FE] for /wisej/: Entered AspNetRequest() constructor.
01:26:49.5158 PM @@@@ LT [00000000-0000-0000-2300-0080000000FE] for /wisej/: ProcessRequest: AspNetRequest object instantiated.
01:26:49.5178 PM Handling request for “/wisej/” mapped to “C:\Temp\wisej”.
01:26:49.5208 PM Request path modified to “/wisej/Default.html” mapped to “C:\Temp\wisej\Default.html”.
01:26:49.5268 PM ProcessRequest: Bypassing application server – serving “/wisej/” straight up.
01:26:49.5318 PM SendResponseFromMemory(): Starting serving “/wisej/Default.html” as uncompressed (or compressed by application) text/html. HTTP result 200. Data length: 177
01:26:49.5438 PM Written 177 bytes (before compression, if any) in responding to “http://127.0.0.1/wisej/”.
01:26:49.5448 PM @@@@ LT [00000000-0000-0000-2300-0080000000FE] for /wisej/: Entered AspNetRequest.GoOutOfBusiness().
01:26:49.5448 PM @@@@ LT [00000000-0000-0000-2300-0080000000FE] for /wisej/: Starting AspNetRequest.GoOutOfBusiness() cleanup.
01:26:49.5448 PM @@@@ LT [00000000-0000-0000-2300-0080000000FE] for /wisej/: Leaving AspNetRequest.GoOutOfBusiness().
01:26:49.5448 PM @@@@ LT [00000000-0000-0000-2300-0080000000FE] for /wisej/: ProcessRequest: Leaving ApplicationRequestDispatched.ProcessRequest().
01:26:49.5468 PM @@@@ LT [00000000-0000-0000-2300-0080000000FE] for /wisej/: Leaving HandleRequest(requestContext);
01:26:49.5478 PM @@@@ LT [00000000-0000-0000-2300-0080000000FE] for /wisej/: Leaving AcceptRequest();
01:26:49.5908 PM @@@@ LT [00000000-0000-0000-2400-0080000000FE] for /wisej/wisej.wx: Got context from this.listener.EndGetContext(ar);
01:26:49.5908 PM @@@@ LT [00000000-0000-0000-2400-0080000000FE] for /wisej/wisej.wx: Entered HandleRequest(requestContext);
01:26:49.5908 PM Received GET request of size 0 for: “/wisej/wisej.wx”.
01:26:49.5918 PM @@@@ LT [00000000-0000-0000-2400-0080000000FE] for /wisej/wisej.wx: Entered ApplicationRequestDispatched.ProcessRequest(), about to construct AspNetRequest object.
01:26:49.5918 PM @@@@ LT [00000000-0000-0000-2400-0080000000FE] for /wisej/wisej.wx: Entered AspNetRequest() constructor.
01:26:49.5918 PM @@@@ LT [00000000-0000-0000-2400-0080000000FE] for /wisej/wisej.wx: ProcessRequest: AspNetRequest object instantiated.
01:26:49.5918 PM Handling request for “/wisej/wisej.wx” mapped to “C:\Temp\wisej\wisej.wx”.
01:26:49.5918 PM @@@@ LT [00000000-0000-0000-2400-0080000000FE] for /wisej/wisej.wx: ProcessRequest: Before HttpRuntime.ProcessRequest().
01:26:49.9028 PM SendResponseFromMemory(): Starting serving “/wisej/wisej.wx” as uncompressed (or compressed by application) text/html; charset=utf-8. HTTP result 404. Data length: 2705
01:26:49.9068 PM Written 2705 bytes (before compression, if any) in responding to “http://127.0.0.1/wisej/wisej.wx”.
01:26:49.9158 PM @@@@ LT [00000000-0000-0000-2400-0080000000FE] for /wisej/wisej.wx: Entered AspNetRequest.EndOfRequest(). this.responseClosed = False
01:26:49.9168 PM @@@@ LT [00000000-0000-0000-2400-0080000000FE] for /wisej/wisej.wx: Entered AspNetRequest.GoOutOfBusiness().
01:26:49.9168 PM @@@@ LT [00000000-0000-0000-2400-0080000000FE] for /wisej/wisej.wx: Starting AspNetRequest.GoOutOfBusiness() cleanup.
01:26:49.9168 PM @@@@ LT [00000000-0000-0000-2400-0080000000FE] for /wisej/wisej.wx: Leaving AspNetRequest.GoOutOfBusiness().
01:26:49.9208 PM @@@@ LT [00000000-0000-0000-2400-0080000000FE] for /wisej/wisej.wx: ProcessRequest: HttpRuntime.ProcessRequest() completed successfully.
01:26:49.9208 PM @@@@ LT [00000000-0000-0000-2400-0080000000FE] for /wisej/wisej.wx: ProcessRequest: Leaving ApplicationRequestDispatched.ProcessRequest().
01:26:49.9208 PM @@@@ LT [00000000-0000-0000-2400-0080000000FE] for /wisej/wisej.wx: Leaving HandleRequest(requestContext);
01:26:49.9218 PM @@@@ LT [00000000-0000-0000-2400-0080000000FE] for /wisej/wisej.wx: Leaving AcceptRequest();
01:28:02.2989 PM @@@@ LT [00000000-0000-0000-2500-0080000000FE] for /wisej/wisej.wx: Got context from this.listener.EndGetContext(ar);
01:28:02.2989 PM @@@@ LT [00000000-0000-0000-2500-0080000000FE] for /wisej/wisej.wx: Entered HandleRequest(requestContext);
01:28:02.2989 PM Received GET request of size 0 for: “/wisej/wisej.wx”.
01:28:02.2989 PM @@@@ LT [00000000-0000-0000-2500-0080000000FE] for /wisej/wisej.wx: Entered ApplicationRequestDispatched.ProcessRequest(), about to construct AspNetRequest object.
01:28:02.2989 PM @@@@ LT [00000000-0000-0000-2500-0080000000FE] for /wisej/wisej.wx: Entered AspNetRequest() constructor.
01:28:02.2989 PM @@@@ LT [00000000-0000-0000-2500-0080000000FE] for /wisej/wisej.wx: ProcessRequest: AspNetRequest object instantiated.
01:28:02.2989 PM Handling request for “/wisej/wisej.wx” mapped to “C:\Temp\wisej\wisej.wx”.
01:28:02.2999 PM @@@@ LT [00000000-0000-0000-2500-0080000000FE] for /wisej/wisej.wx: ProcessRequest: Before HttpRuntime.ProcessRequest().
01:28:02.3019 PM SendResponseFromMemory(): Starting serving “/wisej/wisej.wx” as uncompressed (or compressed by application) text/html; charset=utf-8. HTTP result 404. Data length: 2705
01:28:02.3019 PM Written 2705 bytes (before compression, if any) in responding to “http://127.0.0.1/wisej/wisej.wx”.
01:28:02.3029 PM @@@@ LT [00000000-0000-0000-2500-0080000000FE] for /wisej/wisej.wx: Entered AspNetRequest.EndOfRequest(). this.responseClosed = False
01:28:02.3029 PM @@@@ LT [00000000-0000-0000-2500-0080000000FE] for /wisej/wisej.wx: Entered AspNetRequest.GoOutOfBusiness().
01:28:02.3029 PM @@@@ LT [00000000-0000-0000-2500-0080000000FE] for /wisej/wisej.wx: Starting AspNetRequest.GoOutOfBusiness() cleanup.
01:28:02.3029 PM @@@@ LT [00000000-0000-0000-2500-0080000000FE] for /wisej/wisej.wx: Leaving AspNetRequest.GoOutOfBusiness().
01:28:02.3039 PM @@@@ LT [00000000-0000-0000-2500-0080000000FE] for /wisej/wisej.wx: ProcessRequest: HttpRuntime.ProcessRequest() completed successfully.
01:28:02.3039 PM @@@@ LT [00000000-0000-0000-2500-0080000000FE] for /wisej/wisej.wx: ProcessRequest: Leaving ApplicationRequestDispatched.ProcessRequest().
01:28:02.3039 PM @@@@ LT [00000000-0000-0000-2500-0080000000FE] for /wisej/wisej.wx: Leaving HandleRequest(requestContext);
01:28:02.3039 PM @@@@ LT [00000000-0000-0000-2500-0080000000FE] for /wisej/wisej.wx: Leaving AcceptRequest();
01:28:27.2033 PM @@@@ LT [00000000-0000-0000-2600-0080000000FE] for /wisej/: Got context from this.listener.EndGetContext(ar);
01:28:27.2033 PM @@@@ LT [00000000-0000-0000-2600-0080000000FE] for /wisej/: Entered HandleRequest(requestContext);
01:28:27.2033 PM Received GET request of size 0 for: “/wisej/”.
01:28:27.2033 PM @@@@ LT [00000000-0000-0000-2600-0080000000FE] for /wisej/: Entered ApplicationRequestDispatched.ProcessRequest(), about to construct AspNetRequest object.
01:28:27.2033 PM @@@@ LT [00000000-0000-0000-2600-0080000000FE] for /wisej/: Entered AspNetRequest() constructor.
01:28:27.2033 PM @@@@ LT [00000000-0000-0000-2600-0080000000FE] for /wisej/: ProcessRequest: AspNetRequest object instantiated.
01:28:27.2033 PM Handling request for “/wisej/” mapped to “C:\Temp\wisej”.
01:28:27.2043 PM Request path modified to “/wisej/Default.html” mapped to “C:\Temp\wisej\Default.html”.
01:28:27.2043 PM ProcessRequest: Bypassing application server – serving “/wisej/” straight up.
01:28:27.2043 PM SendResponseFromMemory(): Starting serving “/wisej/Default.html” as uncompressed (or compressed by application) text/html. HTTP result 200. Data length: 177
01:28:27.2043 PM Written 177 bytes (before compression, if any) in responding to “http://127.0.0.1/wisej/”.
01:28:27.2043 PM @@@@ LT [00000000-0000-0000-2600-0080000000FE] for /wisej/: Entered AspNetRequest.GoOutOfBusiness().
01:28:27.2043 PM @@@@ LT [00000000-0000-0000-2600-0080000000FE] for /wisej/: Starting AspNetRequest.GoOutOfBusiness() cleanup.
01:28:27.2043 PM @@@@ LT [00000000-0000-0000-2600-0080000000FE] for /wisej/: Leaving AspNetRequest.GoOutOfBusiness().
01:28:27.2043 PM @@@@ LT [00000000-0000-0000-2600-0080000000FE] for /wisej/: ProcessRequest: Leaving ApplicationRequestDispatched.ProcessRequest().
01:28:27.2043 PM @@@@ LT [00000000-0000-0000-2600-0080000000FE] for /wisej/: Leaving HandleRequest(requestContext);
01:28:27.2043 PM @@@@ LT [00000000-0000-0000-2600-0080000000FE] for /wisej/: Leaving AcceptRequest();
01:28:27.2574 PM @@@@ LT [00000000-0000-0000-2700-0080000000FE] for /wisej/wisej.wx: Got context from this.listener.EndGetContext(ar);
01:28:27.2574 PM @@@@ LT [00000000-0000-0000-2700-0080000000FE] for /wisej/wisej.wx: Entered HandleRequest(requestContext);
01:28:27.2574 PM Received GET request of size 0 for: “/wisej/wisej.wx”.
01:28:27.2574 PM @@@@ LT [00000000-0000-0000-2700-0080000000FE] for /wisej/wisej.wx: Entered ApplicationRequestDispatched.ProcessRequest(), about to construct AspNetRequest object.
01:28:27.2574 PM @@@@ LT [00000000-0000-0000-2700-0080000000FE] for /wisej/wisej.wx: Entered AspNetRequest() constructor.
01:28:27.2574 PM @@@@ LT [00000000-0000-0000-2700-0080000000FE] for /wisej/wisej.wx: ProcessRequest: AspNetRequest object instantiated.
01:28:27.2574 PM Handling request for “/wisej/wisej.wx” mapped to “C:\Temp\wisej\wisej.wx”.
01:28:27.2574 PM @@@@ LT [00000000-0000-0000-2700-0080000000FE] for /wisej/wisej.wx: ProcessRequest: Before HttpRuntime.ProcessRequest().
01:28:27.2584 PM SendResponseFromMemory(): Starting serving “/wisej/wisej.wx” as uncompressed (or compressed by application) text/html; charset=utf-8. HTTP result 404. Data length: 2705
01:28:27.2594 PM Written 2705 bytes (before compression, if any) in responding to “http://127.0.0.1/wisej/wisej.wx”.
01:28:27.2594 PM @@@@ LT [00000000-0000-0000-2700-0080000000FE] for /wisej/wisej.wx: Entered AspNetRequest.EndOfRequest(). this.responseClosed = False
01:28:27.2594 PM @@@@ LT [00000000-0000-0000-2700-0080000000FE] for /wisej/wisej.wx: Entered AspNetRequest.GoOutOfBusiness().
01:28:27.2604 PM @@@@ LT [00000000-0000-0000-2700-0080000000FE] for /wisej/wisej.wx: Starting AspNetRequest.GoOutOfBusiness() cleanup.
01:28:27.2604 PM @@@@ LT [00000000-0000-0000-2700-0080000000FE] for /wisej/wisej.wx: Leaving AspNetRequest.GoOutOfBusiness().
01:28:27.2604 PM @@@@ LT [00000000-0000-0000-2700-0080000000FE] for /wisej/wisej.wx: ProcessRequest: HttpRuntime.ProcessRequest() completed successfully.
01:28:27.2604 PM @@@@ LT [00000000-0000-0000-2700-0080000000FE] for /wisej/wisej.wx: ProcessRequest: Leaving ApplicationRequestDispatched.ProcessRequest().
01:28:27.2614 PM @@@@ LT [00000000-0000-0000-2700-0080000000FE] for /wisej/wisej.wx: Leaving HandleRequest(requestContext);
01:28:27.2614 PM @@@@ LT [00000000-0000-0000-2700-0080000000FE] for /wisej/wisej.wx: Leaving AcceptRequest();
01:28:34.4398 PM @@@@ LT [00000000-0000-0000-2800-0080000000FE] for /wisej/wisej.wx: Got context from this.listener.EndGetContext(ar);
01:28:34.4398 PM @@@@ LT [00000000-0000-0000-2800-0080000000FE] for /wisej/wisej.wx: Entered HandleRequest(requestContext);
01:28:34.4398 PM Received GET request of size 0 for: “/wisej/wisej.wx”.
01:28:34.4398 PM @@@@ LT [00000000-0000-0000-2800-0080000000FE] for /wisej/wisej.wx: Entered ApplicationRequestDispatched.ProcessRequest(), about to construct AspNetRequest object.
01:28:34.4398 PM @@@@ LT [00000000-0000-0000-2800-0080000000FE] for /wisej/wisej.wx: Entered AspNetRequest() constructor.
01:28:34.4398 PM @@@@ LT [00000000-0000-0000-2800-0080000000FE] for /wisej/wisej.wx: ProcessRequest: AspNetRequest object instantiated.
01:28:34.4398 PM Handling request for “/wisej/wisej.wx” mapped to “C:\Temp\wisej\wisej.wx”.
01:28:34.4398 PM @@@@ LT [00000000-0000-0000-2800-0080000000FE] for /wisej/wisej.wx: ProcessRequest: Before HttpRuntime.ProcessRequest().
01:28:34.4418 PM SendResponseFromMemory(): Starting serving “/wisej/wisej.wx” as uncompressed (or compressed by application) text/html; charset=utf-8. HTTP result 404. Data length: 2705
01:28:34.4418 PM Written 2705 bytes (before compression, if any) in responding to “http://127.0.0.1/wisej/wisej.wx”.
01:28:34.4428 PM @@@@ LT [00000000-0000-0000-2800-0080000000FE] for /wisej/wisej.wx: Entered AspNetRequest.EndOfRequest(). this.responseClosed = False
01:28:34.4428 PM @@@@ LT [00000000-0000-0000-2800-0080000000FE] for /wisej/wisej.wx: Entered AspNetRequest.GoOutOfBusiness().
01:28:34.4428 PM @@@@ LT [00000000-0000-0000-2800-0080000000FE] for /wisej/wisej.wx: Starting AspNetRequest.GoOutOfBusiness() cleanup.
01:28:34.4428 PM @@@@ LT [00000000-0000-0000-2800-0080000000FE] for /wisej/wisej.wx: Leaving AspNetRequest.GoOutOfBusiness().
01:28:34.4428 PM @@@@ LT [00000000-0000-0000-2800-0080000000FE] for /wisej/wisej.wx: ProcessRequest: HttpRuntime.ProcessRequest() completed successfully.
01:28:34.4438 PM @@@@ LT [00000000-0000-0000-2800-0080000000FE] for /wisej/wisej.wx: ProcessRequest: Leaving ApplicationRequestDispatched.ProcessRequest().
01:28:34.4438 PM @@@@ LT [00000000-0000-0000-2800-0080000000FE] for /wisej/wisej.wx: Leaving HandleRequest(requestContext);
01:28:34.4448 PM @@@@ LT [00000000-0000-0000-2800-0080000000FE] for /wisej/wisej.wx: Leaving AcceptRequest();
Hi Tiago,
In one of the linux early tests I could compile everything using mono (using http, not websocket). One of the issues that we will have to solve when we get there (after the release) is the lack of HTTP/WebSocket servers on linux and the cumbersome server/app interfaces. Apache was not designed for WebSocket, but it has a mod that can tunnel to another WebSocket server.
One thing I’m looking at is Owin and Owin/Katana (Open Web Interface). It will be part of the embedded wisej coding. This way we can expose an open interface to any owin-compatible web server, including self hosting.
Best,
Luca
Hi Mark,
I just tried again to make sure the build was correct. If you get page not found it means that the handler is not registered. The error we had before the fix was 505 server error because the handler generated the PlatformNotSupported exception.
It worked out of the box after installing cassini/ultradev on a new machine. Added the app, selected the default document, turned off compression, left the bypass asp.net setting on. See screenshot:
Best,
Luca
Hi Frank,
I have tried with the latest from 08.07.2016 (1.2.20) and there seems to be no difference, in that the test project won’t run with Cassini/UltiDev. I get a 404 Not Found when the browser requests ‘wisej.wx ‘. I modified the web.config as Luca suggested above.
Has anyone at ITG managed to run up a project using a server other than IIS/IISExpress using the fix?
Regards,
Mark
Hi Mark,
please note that WJ-7397 has been fixed in our latest beta build (1.2.19).
Can you please retry using the changes for web.config that Luca has suggested in his previous answer.
Thanks in advance !
Best regards
Frank
All the classes that we need are available in mono. The question is if they are reliable and if they perform the same as in .NET. If they don’t, we can rewrite them. It’s a question of time, effort, and benefit.
Technically it’s 100% sure that Wisej and wisej apps can run on linux. When and with how much effort is what I cannot answer yet.
Our target platform for the release is Windows/IIS.
Best,
Luca
If I understand correctly the Mono compatibility page, Mono fully supports .NET 4.5 and ASP.NET.
Does Wisej needs System.Windows.Forms at runtime? If it does, I guess this is incompatible with Linux.
Hi Mark,
Found the reason why it doesn’t work with Cassini and have logged an enhancement for the next update: WJ-7397 “Add support for classic pipeline”.
Cassini only works with the older classic pipeline so you need to configure web.config like this:
<system.web> ... <httpHandlers> <add verb="*" path="*.wx" type="Wisej.Core.HttpHandler, Wisej.Core" validate="false"/> <add verb="*" path="*.wx/*" type="Wisej.Core.HttpHandler, Wisej.Core" validate="false"/> </httpHandlers> <httpModules> <add name="Wisej" type="Wisej.Core.HttpModule, Wisej.Core"/> </httpModules> </system.web>
However, without the WJ-7397 this will still not work because Wisej checks for an incoming WebSocket upgrade and the System.Web.HttpContext implementation throws a PlatformNotSupported exception instead of false…
The good part is that it works with the asynchronous IHttpHandler.
For the license, Joe Meyer will contact you to get some more info and provide the OEM/ISV licensing model.
About the self contained exe, the plan is (after the release) to use http://sensaura.org/pages/tools/iotweb/ together with a Wisej library and a boxing tool that can optionally virtualize everything in a single self-contained executable capable of displaying it’s own UI (Wisej would act as a desktop app) and to serve external users as if it was a server box.
Linux support may come later, probably much later. We don’t know the technical barriers yet.
Best,
Luca
Hi Luca,
“We are also planning an extension that would turn a Wisej web application into a single standalone .NET executable …”
This would be a massive plus to WiseJ (IMHO), for our generalized use case we would need this to also run on Linux (we standardize around Debian, obviously utilizing mono currently but I would suggest keeping an eye on .NET Core as this is nearly ready to run most ASP.NET applications [apparently]).
Re: licensing, we already license other development solutions in the way you describe, so hopefully we can sort something out.
Please can you forward the transcript of this conversation to your sales and ask them to get in touch with me on the same email I am using here to post (I assume you have access to it?).
Regards,
Mark
Hi Mark,
We will have an ISV license with unlimited activations. It’s similar to an OEM license. We already have several ISVs using our other framework with site development license and unlimited distributions. When an ISV is deploying to 4000 servers we know very well that we cannot sell 4000 licenses.
The cost is a flat fee that is negotiated individually. The ISV license is a single key that the ISV can embed in their distribution. It can be unlimited or capped at a number decided by the ISV.
If you would like an early quote in order for you to determine if Wisej is worth the effort I’d be more than happy to have our sales guy contact you.
Best,
Luca
Hi Luca,
Thanks for the responses.
Your technical response to the embedded webserver makes sense. I’m not sure why it doesn’t work with Cassini then, strange.
However the technical aspects would be overshadowed by the cost negatives of the current licence costs anyway as it stands. The end units in question are planned to be in the hundreds if not thousands and they are low cost. With the webserver part of the units operation being a “nice to have” setup/configuration tool, there is no way the licence cost per unit could be justified.
It’s a shame, as Wisej looks perfect to perform the webserver task for these units. To put it in context, we would rather have 100 servers limited to 1 concurrent user than 1 server limited to 100 concurrent users.
Anyhow, thanks again for your time.
Mark
Forgot the question about the license model. An embedded web server is still a server instance in the license model. Each server instance will need a server license, regardless of the number of applications and CPUs.
https://wisej.com/support/question/licensing-model-and-costs
Best,
Luca
Hi Mark,
Wisej intefaces with the web server using IHttpHandler and IHttpApplication. However, the module IHttpApplication can be omitted if you don’t need to use urls without the extension.
Basically if VWG was working then also Wisej should work. Unless the web server doesn’t support the async IHttpHandler, which is the same used by VWG in their later releases.
For the short run I will try Cassini/Ultidev and see why it doesn’t work. It should and most likely it will soon.
After the release we are planning to look into FastCGI, Apache mod or mod_mono, and Linux. We are also planning an extension that would turn a Wisej web application into a single standalone .NET executable (probably using Cassini or another embedded WebSocket server)
Best,
Luca