### Version 6.50
*not released yet*
* **Template Updates to BootStrap 4 and Upated Support Libraries**
Overhauled the default project templates to use Bootstrap 4 and FontAwesome 5 and updated overall styling to be more up to date. Updated related components like the date `HtmlDateTextBox()` to use **tempusdominus-bootstrap-4** date picker control. Helpers support both Bootstrap 3 and 4, via a compiler switch `BOOSTRAP_VERSION 4`. There have been many tweaks and updates to the styles for cleaner rendering and a number of new support styles have been added
* **[Updated Visual Studio Templates and Intellisense Snippets](VFPS://Topic/_5BB19P27H)**
We've created 20 or so Intellisense snippets (Ctrl-k-x -> My Html Snippets -> Web Connection) that let you quickly inject common Web Connection and Bootstrap controls/components into the page with minimal effort. We also provide **Visual Studio Code** Page Snippet templates for Layout, Content and Standalone pages.
* **[Generic Markdown Page Rendering](VFPS://Topic/_5AY1D91UT)**
New projects now include the ability to render any Markdown page with an `.md` extension and render it into HTML. You can simply drop a Markdown file into a folder add any dependent images and have that page rendered. A custom `Markdown_Template.wcs` template can be customized to provide custom page layout for site chrome to match your site's identity.
* **Response.ExpandScript() and Response.ExpandTemplate() Return as String**
These two functions can now be called to parse a script or template and return the output result as a string rather than writing output into the Response stream as complete pages. Render pages or partials into HTML and use them from process class code directly. Although we recommend using scripts and tempaltes along with Partials to do embed external templates, it can sometimes be useful to 'call' a partial component directly from code. For example a Login component might be rendered into non-ript Use the new `tlRenderAsHtml` parameter on both functions to return results as string.
* **`<% %>` Scripting inside of `<markdown></markdown>`**
You can also use script and expression tags **inside** of Markdown blocks to effectively script Markdown text.
* **[Updated Markdown Island Support in Scripts and Templates](VFPS://Topic/_4I50RWXWX)**
Web Connection has support `<markdown></markdown>` tag islands into which you can put Markdown text that is rendered as HTML for a while. Previously you **had to** left align the Markdown content. With this release Markdown content no longer has to be left aligned, rather the parser detects the common space before all lines and strips it.
Added a method that can produce HTML output from an RSS Feed. The method is customizable with a `HtmlRssFeedConfig` that allows control over number of items retrieved and a number of formatting options for the feed.
* **Fix: Remove hardcoded Content Page Paths from Scripts**
Changed the generated PRG output for content pages so that the content page path is no longer hardcoded into the page code. This fixes issues where if a compiled FXP was moved to a new location it would fail due to an invalid template path. Updated code provides the content page path up the call stack and persists it into the layout page.
* **New File Upload Samples**
Removed the overly complex plUpload component from Web Connection and instead provided simpler pure AJAX examples as well as a simpler and much more modern uploader called <a href="https://uppy.io/" target="top">Uppy</a>. There are <a href="https://west-wind.com/wconnect/wcscripts/fileupload.wwd" target="top">simple file upload samples</a>, and an example of <a href="https://west-wind.com/wconnect/wcscripts/UppyAndCarousel.wwd" target="top"> uploads displaying in an image carousel</a>.
* **wwUserSecurity Improvements**
Updated wwUserSecurity logic to automatically create `.oUserSecurity` and [.oUser](VFPS://Topic/_26F12NDJO)` objects on each requests. When accessing these objects Web Connection checks to see if they already exist and if not they are created. If a user is not logged in, an empty oUser record is created and you can check for an empty user with [oUserSecurity.IsEmpty()](VFPS://Topic/_5B8198NSV).
* **[wwPdfPrinterDriver PDF Printer for wwPDF](VFPS://Topic/_5AS0URRCN)**
Added a generic PDF driver that can be used with any printer driver that outputs to PDF including the built-in **Microsoft Print to PDF** driver in Windows 10 and Windows Server 2016 and later. This driver handles report printing, capturing and waiting for the output file from the print spooler and dealing with unattended mode issues when running in COM modes.
* **wwDotnetBridge - Automatically unblock DLL**
Added logic to automatically unblock `wwDotnetBridge.dll`. This should help with many common loader error issues.
* **Improved Error Message for wwDotnetBridge Load Errors**
wwDotnetBridge has a few rules required in order to run it - specifically related to Internet downloaded-loaded DLLs and loading from a network. Updated the loader error message with common causes and link to documentation.
* **wwUtils.SanitizeHtml() to sanitize HTML strings**
Added a new SanitizeHtml() function to wwUtils to strip scriptable code out of HTML text. Useful for cleaning up user captured HTML or Markdown text to prevent XSS attacks from user input. Requires .NET.
* **wwDotnetBridge Fixup for List<T> return values**
Added additional support for `List<T>` return values to `InvokeMethod()` and `GetProperty()` results, which returns these values as a ComArray now.
Added method hook that is called after a user is logged out. This is useful for removing additional application specific state that might be saved in session or other application data stores.
* **[wwProcess::InitSession(): New llSecure parameter](VFPS://Topic/_S8413MYP2)**
You can now specify that the Session cookie created can only be used under HTTPS via the `llSecure` parameter. This translates to the `Secure` flag of the cookie created.
* **<a href="https://west-wind.com/wconnect/weblog/ShowEntry.blog?id=943" target="top">Add BrowserSync.prg to new Project Template</a>**
New projects now get a `BrowserSync.prg` that can be used to live reloading when you make changes to HTML, CSS, JS and Script/Templates in your project. Requires NodeJs/NPM install for Browser-Sync, but this incredibly useful feature makes it much quicker to iterate server side code similar to the way client side tools work.
### Version 6.21
<small>@icon-clock-o June 15th, 2018
[Release Blog Post](https://west-wind.com/wconnect/weblog/ShowEntry.blog?id=940) •
* **[wwDotnetBridge support for Event Handling](VFPS://Topic/_57Q019PW0)**
wwDotnetBridge now supports subscribing to and handling of events via the new `loBridge.SubscribeToEvents()` method. You provide a source .NET object that fires events and a FoxPro object that implements the corresponding event methods that you want to implement. Thanks to Edward Brey who built out this feature in the OSS version of wwDotnetBridge!
* **New .NET Runtime Loader and better loader Error Handling**
Updated the wwDotnetBridge .NET CLR to using current loader APIs which provide for better error trapping. Load failures should now provide improved error information to client if the .NET Runtime bootstrapping fails.
* **[Console Command for Disable Loopback Checking](VFPS://Topic/_4GI0QL5JB)**
On servers and now also on newer versions of Windows 10 IIS enforces local loopback check policy which **doesn't allow for local Windows authentication to work**. If you try to access the Admin pages with authentication it will fail if the policy is applied. We've added a new command `console.exe disableLoopbackChecking` to disable this policy.
### Version 6.20
<small>@icon-clock-o April 17th, 2018</small>
* **Support >16meg uploads with wwHttp**
You can now upload files larger than 16mb with wwhttp by using the new `lUseLargePostBuffer` flag and setting it to `.T.`. Internally this class uses a file stream buffer to hold the POST buffer.
* **[Updated wwFileStream Class to create >16mb Strings](VFPS://Topic/_56G0MO1OA)**
The wwFileStream class provides a file based stream that allows creation of large strings that exceed 16mb and can be loaded into FoxPro strings as a whole. FoxPro supports >16mb strings in limited fashion (basically >16mb string can't be mutated), and this class allows you to create those strings.
Added helper method to send emails using the configuration settings made in `<yourApp>.ini`. This makes is easier to send confirmation and notification emails from within your code.
* **`message` Parameter for Login**
The `Authenticate("Login")` method and the stock Login form now support displaying of a message as part of the login form by providing a Query string parameter for example: `Login.wwd?message=Password verified.`.
* **wwJsonSerializer::Serialize() llFormat Option**
The `Serialize()` method now has an `llFormat` parameter that allows specifying that the content should be pretty formatted. This is in addition to the `FormattedOutput` flag on the serializer itself.
* **Fix: File2Var() UTF-8 Detection**
Fixed bug in File2Var() that would cause problems with UTF-8 BOM detection in non-Western alphabets.
* **Fix: wwEncryption with Upper ASCII Characters**
Fixed issue with wwEncryption not properly two way decrypting upper ASCII characters as the Code Page mapping was off. Switched to UTF-8 character sets when encoding and decoding which works on all ANSI codepages as long as the same code page is used to encode and decode.
* **Fix: .NET Module AdminAccount with multiple Accounts**
Fix issue where AdminAccount was not properly working when multiple accounts were configured - account wouldn't validate against the list. Fixed.
### Version 6.19
<small>@icon-clock-o February 7th, 2018
[Security Weblog Post](https://west-wind.com/wconnect/weblog/ShowEntry.blog?id=936)
* **Security Update: Update Admin.aspx Page to Disallow Unauthenticated Remote Access**
Added logic to the Admin page to disallow access to the Admin page when not authenticated. Local machine access only displays an error message just like previous versions, but remote access now shows an error message and does not display the admin page links.
* **wwRequest::Form support for > 16meg Strings**
Added support for reading Form variables when the Form buffer is greater than 16megs. FoxPro supports strings > 16megs as long as the string is not manipulated with any string mutating functions. But most importantly you can write a > 16meg string easily into file. [More info.](https://support.west-wind.com/Thread53Q0KU1HZ.wwt). Thanks to Keith Hackett for providing this solution.
Added an additional wwServer hook method that is fired after the server is initialized. This hook can be subclassed in the wwServer subclass, and is called after the server has been initialized but before the first request and `OnLoad()` are fired.
### Version 6.18
<small>@icon-clock-o January 9th, 2018
[Release Blog Post](https://west-wind.com/wconnect/weblog/ShowEntry.blog?id=935)
* **Add back Apache Support and support Apache 2.4.x**
Due to a number of requests from customers as well as generous support by way of contract work sponsored by James Heuer, we've added back support for Apache. Apache was dropped in Web Connection 6.15 and is now back with Apache 2.4 support plus a few additional new features.
* **[Improved and simplified Apache Configuration](VFPS://Topic/_1EM0YFUTX)**
The New Project Wizard now works more reliably with automatically setting up an Apache server configuration. Configuration also has been simplified a bit with new features added to Apache for configuration of virtuals and scriptmaps. There's also better compatibility with direct support for `PHYSICAL_PATH` and `APPL_PHYSICAL_PATH` settings available the Apache request pay load which makes Apache more compatible with IIS's ISAPI implementation.
* **JsonDate() function in wwUtils**
Added a `JsonDate()` function that creates a JSON formatted date string that is properly UTC adjusted. Function lives in wwUtils but requires wwDotnetBridge/.NET to work.
* **Unload and Reload Individual COM Servers**
There's a new `shutdowninstance.wc?pid=1234` maintenance request for COM servers that shuts down a running COM instance that will be reloaded on the next hit. This can be used to remotely or internally restart individual instances that may be running with too much memory. Uses the Process ID as identifier.
* **<a href="https://west-wind.com/wconnect/weblog/showentry.blog?id=934" target="top">Fix: Close FoxPro when Web Connection is Running</a>**
Fix issue where FoxPro cannot be shut down when Web Connection is running inside of the IDE in file mode with *Cannot Quit Visual FoxPro* error message. Hooked window events so shutdown works as expected in file mode. There's now also a [wwServer::Shutdown](VFPS://Topic/_53O00ZTB6) method that is called when the server is shutdown - in file mode only.
* **Fix: wwJsonSerializer UTC Formatting**
Fixed problem with the wwJsonSerializer where UTC dates weren't properly showing time zones other then current time zone.
* **Fix: wwJsonSerializer Deserialization Property Names**
FoxPro supports only alpha-numeric plus `_` for property names and this filter ensures that deserialized properties are cleaned up to remove all but those characters via a new `PropertyNameCharacterFilter` property.
<div class="updatenotice" style="margin-left: 0;margin-right">
#### @icon-warning Breaking Changes for v6.18
* **wwJsonSerializer::Serialize() now relies on .NET**
The wwJsonSerializer now uses .NET functions to serialize date values with proper UTC conversions that previously weren't handled. `wwJsonSerializer::DeserializeJson()` already depended on .NET so not a big change.
### Version 6.17
<small>@icon-clock-o October 16th, 2017
<a href="https://west-wind.com/wconnect/weblog/showentry.blog?id=933" target="top">Release Blog Post</a>
* **Better Error information for wwDotnetBridge Load Errors**
wwDotnetBridge will now report slightly better error information on load failures, when failing to load the runtime or initial wwdotnetbridge instance.
* **Browse Button on the Server Form**
The server form now has a **Browse Site** button that can open a browser window with the configured **HomeSite** url.
* **JsonSerialize() and JsonDeserialize() Helper Function**
Added helper functions that let you use the JSON serializer without having to create a new object instance of wwJsonSerializer for each serialization process operation. The helpers simply wrap the `Serialize()` and `DeserializeJson()` methods for easier usage.
* **Updated Process Templates**
The default wwProcess templates for new process classes have been updated with a few enhancements: The template automatically adds Intellisense references for `THIS` and the Web Connection top level intrinsic objects (Request, Resonse, Server, Session) via `#if .F.` blocks hide the the directives from executing code but allow the editor to find the Intellisense references. Process classes now also default to Scripts for missing controller/process class methods (ie headless scripts).
* **Buid Script Updates**
The `build.bat` file generated into a new project folder to create a packaged application ready for deployment has been updated to create a more complete deployment package. Previously the script only pulled the EXE and all the Web Connection system dlls required to deploy the binary folder. The updated script adds the Web and Data folders by default and creates the same structure as the project with Deploy/Web/Data top level folders.
* **Improvements in COM Server Load Times**
COM Servers now load slightly faster as the COM load sequence has been optimized further after the last releases parallelization of server loading onto pool threads. Servers are now loaded onto MTA threads (rather than STA), which provides faster startup and less overhead in ASP.NET.
### Version 6.15
<small>@icon-clock-o July 17th, 2017
<a href="http://west-wind.com/wconnect/weblog/showentry.blog?id=931" target="top">Release Blog Post</a> • [Breaking Changes](#v615breakingchanges)</small>
* **COM Server Loading Changes**
We've made some changes to the way servers are loaded by separating the `OnInit()` and `OnLoad()` steps to before and after actual server constructor operation. Previously both operations occurred in the confines of the FoxPro `Init()` constructor function which meant any error forced an immediate abort without error information. Now `OnLoad()` is fired **after** the server instance has been created and we can trap errors and display them when the first hit comes in. If an error occurred during load all subsequent requests display that load error - the server is effectively disabled, but you get full error information where previously the server would have not loaded with a cryptic COM error. This should also help with server load speed as load behavior is delayed until after the instance has been returned.
* **Server Count can now be Interactively set on Admin Page**
You can now set the server count interactively on the admin page when using the Web Connection module. This means you can immediately change the number of instances that start up in COM or File Mode with Auto Server start.
* **Exe Servers hotswapped now automatically re-register for COM**
When servers are uploaded and hotswapped via the Web Connection module, servers are now automatically re-registered with the `-regserver` flag after successful upload. This should avoid problems if properties or methods were added to the COM server.
* **New Install-IIS-Features Powershell Script**
Web Connection now ships with a Powershell script called `Install-IIS-Features.ps1` that can be used to install IIS on a Desktop or Server that doesn't have IIS installed. The commands install the Web Service feature/role with all the options required to run Web Connection.
<div class="updatenotice" style="margin-left: 0;margin-right">
#### @icon-warning Breaking Changes for v6.15
* **Web Control Framework no longer loaded by Default**
We've disabled the `WWC_LOAD_WEBCONTROLS` flag in `wconnect.h` which means by default the Web Control framework libraries will not be loaded any longer by `wconnect.prg`. To enable Web Control framework loading you can reenable the `WWC_LOAD_WEBCONTROLS` setting in `WCONNECT_OVERRIDE.h`:
#DEFINE WWC_LOAD_WEBCONTROLS .T.
* **Re-Register COM Servers**
This release makes changes to the COM server interface of the wwServer class which requires for the type libraries to be updated. Make sure you re-register your server with `yourServer.exe -regserver` or by using the new hotswapping features which auto-register the server after upload.
### Version 6.12
<small>@icon-clock-o May 30th, 2017</small>
* **[wwDotnetBridge InitializeDotnetVersion()](VFPS://Topic/wwDotNetBridge%3A%3AInitializeDotnetVersion)**
An explicit function to initialize the .NET Runtime for the entire application. Although this function doesn't really do anything but create an instance of wwDotnetBridge with a specific version, the function makes it clear that this initializes the .NET version for the entire application.
Added properties to set dynamic properties on the user record. This allows you to add custom values to the user record without having to extend the schema explicitly (although you can do that as well - add a field and loSecurity.oUser.NewField).
* **Updated GetUniqueId() to be more Random**
Changed the algorithm of GetUniqueId() using Guids that are redistributed over printable characters. The result is truly random Ids that are more unique with much smaller character counts - as little as 8 characters can provide safe ids for low impact applications with a max of 16 for near 100% fidelity.
* **Add content type to wwHttp::AddPostKey() when uploading files**
You can now specify an optional content type when uploading files to a server using `.nHttpPostMode=2`. The content type is appended to the file data sent to the server.
* **Fix: HMACSHA Hashing in wwEncryption**
Fixed a salt encoding bug in the `ComputHash()` function when calling the HMAC specific methods that require a salt value. Previously the salt value were added to the original string and then encoded. Now the salt value is only applied to the HMAC algorithm processor.
* **Fix: wwSFTP Large File Upload**
Fixed an issue due to a buffer size issue with the underlying SSH library used in wwSFTP. Fixed by ignoring the `nBufferSize` parameter.
### Version 6.10
<small>@icon-clock-o February 2nd, 2017
<a href="http://west-wind.com/wconnect/weblog/showentry.blog?id=925" target="top">Release Blog Post</a> • [Breaking Changes](#v610breakingchanges)</small>
* **< %: expr % > for Templates and Scripts**
Scripts and templates can now use automatic HTML encoding by using `< %: expr % >` instead of `< %= EncodeHtml(expr) % >` (spacing added for rendering). This makes it much easier to create XSS safe string output without more verbose syntax.
* **<a href="https://marketplace.visualstudio.com/items?itemname=rickstrahl.westwindwebconnectionvisualstudioadd-in" target="top">Visual Studio 2017 Addin Support and Visual Studio Gallery</a>**
The Web Connection Visual Studio Addin now supports Visual Studio 2017 and is also published to the Visual Studio Extension Gallery. This means you can install and update the addin directly from Visual Studio and once installed, the extension can automatically update itself.
* **[New wwSFTP Class for SSH based FTP](VFPS://Topic/Class%20wwSFTP)**
There's a new wwSFTP class that provides secure FTP (SFTP only, not FTPS) to connect to SSH based SFTP servers. The class inherits from wwFTP so can be interchangeably with wwFtp based FTP code.
* **[wwUserSecurity Password Encryption via cPasswordEncryptionKey](VFPS://Topic/_4U605502P)**
You can now encrypt your UserSercurity table's passwords by setting the `cPasswordEncryptionKey` when you create your wwUserSecurity instance. When set passwords are automatically hashed before getting saved to the database.
* **[wwEncryption::ComputeHash()](VFPS://Topic/wwEncryption%3A%3AComputeHash) adds HMAC Hash Algorithms**
wwEncryption::ComputeHash() adds HMACSHA1, HMACSHA256, HMACSHA384 and HMACSHA512 algorithms. HMAC algorithms use complex salting cycles to add complexity and delay to generated hashes using an industry standard and repeatable algorithm.
* **[wwRequest::GetLogicalPath() can return Proxied Urls](VFPS://Topic/_S850QHU25)**
GetLogicalPath() now gets a parameter that when true will return the original URL specified before a proxy redirected the URL to your application. Useful when using extensionless URLs redirected via Rewrite rules in IIS.
* **Switch to Markdig Markdown Parser**
Switch markdown parser to use the <a href="https://github.com/lunet-io/markdig" target="top">MarkDig .NET Markdown parser</a> which natively supports Github flavored markdown and many Markdown extensions, including support for auto-links, extra emphasis (strikeout, sub/superscript etc.)
Allows generation of unique IDs based off a full or partial GUID value. Allows specification of a size that determines the size of the generated string between 15 and 32 characters where 32 is a full GUID.
String utility like ALINES() to return a collection of strings that allows you to specify a length to break lines at. Uses ALINES to capture lines and splits lines longer than specified via MEMLINES(). Useful for any code parsing that needs to ensure string literals don't exceed 255 characters in length.
* **wwDotnetBridge now supports TLS 1.2**
wwDotnetBridge now sets the default HTTPS protocols settings to allow for SSL3, TLS1, TLS11 and TLS12. The default previously only allowed for SSL3 and TLS1. Overrides `ServicePointManager.SecurityProtocol` on initial load of the .NET runtime. This affects any .NET API called that uses HTTP including Web service calls.
Explicit function that can be used to compile a single ASP Script page using the same mechanism used to run the page.
* **WCSCompile for pre-compiling Scripts on the Server** Fixed the pre-compilation link on the Admin page that allows recompilation of Scripts (wcs style FoxPro script pages) on the the entire site. This feature now works recursively and can reliably compile scripts assuming all referenced dependencies used in scripts are loaded by the application before compilation occurs.
You can now create a new instance of wwHttp to be used in the wwJsonSerializer implementation when making service calls. You can create a new instance of wwHttp that is pre-configured with Authentication, headers etc. and pass it to this method before a service call.
<div class="updatenotice" style="margin-left: 0;margin-right">
#### @icon-warning Breaking Changes for v6.10
* **wwUserSecurity Table Changes**
The structure of the Usersecurity table has changed and the table structure has to be updated in order to work. Various fields have been expanded for supporting better security and encryption and field types have been changed to var chars instead of fixed width fields for simpler code and more efficient storage. Make sure you check the structure of the table in [wwUserSecurity::CreateTable()](VFPS://Topic/_1P30TA7OQ).
* **Add Markdig.dll to your Distribution**
The new Markdig Markdown parser requires a new DLL to be used. If you're using hte `MarkdownParser` class or the `Markdown()` function, make sure to update to this DLL. You can remove `CommonMark.dll`.
### Version 6.07
<small>@icon-clock-o September 16th, 2016</small>
* **[Angular 2.0 Project Template](VFPS://Topic/_4Q40NERUW)**
Added a pre-configured Angular 2.0 template that is post-installed into a newly created project. A new walk through describes how to set up a new Angular 2.0 project.
* **wwUtils GetWords() Function**
Added a new function that parses a string of multi-word text into a collection of words.
* **Updated Project Templates**
Updated the project templates and Console Project Wizard to generate more comments and notifications when a new project is created, so it's easier to known what to do after the wizard finishes.
### Version 6.05
<small>June 10th, 2016
no breaking changes</small>
* **View Fox Code from Visual Studio Addin for Scripts/Templates**
You can now see the **FoxPro Code** option on the Visual Studio context menu for scripts and templates and even static HTML pages if the page contains `SourceFile="<filename>"`. The file name can contain a `~` virtual path like: `SourceFile="~/../Deploy/MyProcess.prg"` which points back to the source code folder from the Web folder.
* **Web Connection Handler File Upload**
In addition to being able to upload a server EXE file, the handler now supports uploading of arbitrary files to the application's `deploy\temp` folder from the Handler admin page. This makes it easier to push files to the server without having to install an FTP server. Make sure you set the application's request limits to allow larger uploads.
* **[wwDotnetBridge::InvokeMethodAsync()](VFPS://Topic/wwDotNetBridge%3A%3AInvokeMethodAsync) and [wwDotnetBridge::InvokeStaticMethodAysnc()](VFPS://Topic/wwDotNetBridge%3A%3AInvokeStaticMethodAsync)**
New method that allows invoking .NET methods on an instance asynchronously. You pass in callback object that receives `OnCompleted()` and `OnError()` callbacks to get notified of completion of the async operation.
* **[wwUtils::HumanizedDate() Function](VFPS://Topic/wwUtils%3A%3AHumanizedDate)**
Function that returns a human readable string date or time (English only) such as *just now*, *10 minutes ago*, *3 hours ago*, *yesterday*. Anything over a year is turned into a short date: *May 1, 2015*.
* **[wwUtils::FormatValue](VFPS://Topic/wwUtils%3A%3AFormatValue) and [wwUtils::FormatString](VFPS://Topic/wwUtils%3A%3AFormatString)**
Two methods that use .NET string formatting to allow you to use sophisticated string formatting in FoxPro. Easily create nicely formatted date strings, MIME or ISO date formats, non-padded number strings formatted to decimal places with automatic localized formatting.
* **Add `cursor_legacy:cursorName` to wwJsonSerialize table serialization**
You can now serialize cursors in the 'old' default format which included `Rows` and `Count` properties for the actual data array and record count. Provided for backwards compatibility.
* **Fix wwMaint Server File Editor**
Fix bug to properly write the correct file out to disk.
### Version 6.0
<small>@icon-clock-o April 2nd, 2016
<a href="http://west-wind.com/wconnect/weblog/showentry.blog?id=919" target="top">Release Blog Post</a> • [Breaking Changes](#v6breakingchanges)</small>
* **[New Project Wizard](VFPS://Topic/_S8G12B92Q)**
Created an updated New Project Wizard that creates a self contained directory structure that holds code, data and Web content. The Wizard also auto configures all paths and related links in such a way that the application should be xcopy deployable if you take the entire folder structure to the server. The new structure links back to Web Connection source files in the original Web Connection install folder, and separates logic for your own projects away from the Web Connection core files.
* **[New Project Wizard can now generate a REST Service](VFPS://Topic/_S8G12B92Q)**
The new project and new process Wizards now include an option to select the process class type to create. You can either create a standard Web Connection wwProcess class or a wwRestProject. The Rest project creates a service method sample.
* **[New Projects generate a Server Configuration Script](VFPS://Topic/_4GR0WBOA4)**
The New Project Wizard now also generates a `<YourApp>_ServerSetup.prg` file that is FoxPro PRG based script that can configure your Web application. The script is linked from `<YourApp>Main.prg` and can be run it `<YourApp>.exe config` from the command line in a deployed application.
* **[Partial Pages Script and Templates](vfps://Topic/_4DS19CQWR)**
There is now support for partial page references that allow you to render child pages from your Scripts and Templates. You can simply reference child pages with Web relative paths using `< %= RenderPartial("~/PartialPage") % >` where the ~/ points to the root of the Web site. You can also hard reference a file with a full path.
* **Scripts and Templates now support multi-line expressions**
Script and template pages now can use `< %= expr() % >` tags that span multiple lines with line breaks. This especially simplifies use cases where you use complex Html Helpers that include style information. All line breaks are converted to spaces. NOTE: This can cause a problem if you have **literal** strings that include CHR(13) or CHR(10) values.
* **[Native Markdown Support in Scripts and Templates](VFPS://Topic/_4I50RWXWX)**
Script and template pages can embed `< markdown >` and `< \markdown >` tags to embed Markdown text into the markup. The Markdown is parsed inline as the Script or Template page is parsed.
* **[Improved handling of Extensionless Urls](VFPS://Topic/_3K812UDQ3)**
Extensionless URLs are common on the Web and this version of Web Connection adds improved support for them by providing a clean re-write rule (needs to be uncommented) and some additional logic in `wwProcess::UrlRewriteHandler` and `wwProcess::OnUrlRewrite`.
* **[Layout Pages and Sections for Script and Templates](vfps://Topic/_4DS19CQWR)**
You can now also create Layout or "Master" pages for scripts and templates that serve as 'common content' containers for content pages. Layout pages typically contain HTML header and common page chrome data - page headers, menus, sidebars that are common to many pages. Layout pages are called from Content pages via `< % Layout="~/_layout.wc" % >` which renders the layout page, which in turn renders the content page into a `< %= RenderContent() % >` area. Layout pages can also contain section directives to let the content page provide content to embed into the Layout page.
* **[Completely Rewritten Message Board](VFPS://Topic/_0190IC5ZN)**
The message board sample application has been re-written from scratch as an MVC style application using the scripting features in Web Connection 6.0. This application serves as a full featured example for doing MVC style development with Web Connection.
* **[New Markdown Parser](VFPS://Topic/Class%20MarkdownParser)**
Added new `MarkdownParser` and `MarkdownParserExtended` classes that allow parsing of Markdown text to HTML. Markdown is a popular text editing format for developer Web sites and CMS systems that simplifies text input via the simple markup formatting of the <a href="http://daringfireball.net/projects/markdown/syntax" target="top">Markdown Syntax</a>.
* **[jquery-resizable Plug-in](VFPS://Topic/resizable%20jQuery%20Plugin)**
Added a small function that allows 'debouncing' events to a specified number of milliseconds. Allows throttling high volume events like `window.resize()` or drag events to be held and fire only at specified intervals to avoid overloading and hanging the browser.
* **New Visual Studio 2015 VSIX Add-in**
The Web Connection add-in has been updated to a full VSIX add-in that can be installed from Explorer by double-clicking. Functionality has also been updated to support View In Browser functionality for any type of HTML file including Web Connection Script files to make it easier to launch in the browser. If no configuration is provided the View in Browser feature still works with the default project configured URL.
Resolves a virtual path (~\) to a physical path on disk by replacing the virtual path specifier with the application path.
* **Allow Console.exe to run out of folders other than Wconnect Install Folder**
Console.exe can now run from any location. When the console run it'll now explicitly change path to the /wconnect install folder and change back to the original folder when complete.
* **.NET Handler Faster COM Server Loading**
Initial loading of COM servers when the servers are loaded has been improved significantly by removing a redundant load/unload cycle. Servers should now load twice as fast as previously.
* **[.NET Handler now allows Hotswapping of File Based Servers](VFPS://Topic/_1UZ0OXM7V)**
You can now use File based messaging with the .NET Module and hotswap EXE servers. Like the COM Server feature, hotswapping allows dynamic updates of the server EXE file without shutting down IIS/Application Pools.
* **.NET Handler StatusPage Updates**
The .NET module now supports ~\ virtual paths for TempPath and ExeFile paths, and the status page now displays the fully resolved OS path.
Method that allows wwDotnetBridge to set a value from the .NET `System.Convert` static class in a simpler way. Allows access to all `System.Convert` methods.
* **[ComValue::SetUInt64 and SetUInt32 Methods](VFPS://Topic/ComValue.SetUInt64)**
Added additional type conversions for UInt64 and UInt32 values.
New method adds the ability to retrieve an indexed value from an IList based object like arrays and generic lists.
New Html helper that renders the BootStrap DateTimePicker or optionally a native UI on mobile devices.
* **[wwHtmlHelpers HtmlDataGrid OnAfterRowsRendered Event](VFPS://Topic/HtmlDataGridConfig.OnAfterRowsRendered)**
Added an event that is fired when all rows in the grid have rendered. You can attach an expression that can then render HTML to inject additional HTML like a footer.
* **[wwHtmlHelpers::HtmlErrorDisplay Updates](VFPS://Topic/_39213EUXL)**
Updated HtmlErrorDisplay to use BootStrap alert themes and use font-awesome icons. Also added [HtmlErrorDisplayConfig](VFPS://Topic/_4GJ0LR1OQ) class that can be used to configure this method, as well as work as standard Web Connection form validation object.
Added a new method UnbindFormVars() that's very similar to Request.FormVarsToObject() but differs in that it returns an collection of ValidationErrors message if there are binding errors.
* **[wwRequest::FormOrValue](VFPS://Topic/_4FT0OHOG7), [wwRequest::FormSelected](VFPS://Topic/_4GI0W95HP),[wwRequest::FormChecked](VFPS://Topic/_4GI0WTTQ9)**
These new methods return value settings that can be embedded in script expressions into Web controls for `value=""`, `selected` or `checked` values effectively. These methods basically use a model value on GET requests or Request.Form() values on post backs to write out their values facilitating display of PostBack control state.
This method returns multiple uploaded files as a collection. This function support the `MULTIPLE` attribute on the File Upload input control by accessing multiple files from a single form variable.
Like `GetFormMultiple()` but returns a collection instead of an array, to simplify working with the data more easily.
Like `Request.aFormVars()` but returns a collection of objects with `Key` and `Value` properties.
* **[Response.ExpandScript()](VFPS://Topic/_1VO07HGB0) and [Response.ExpandTemplate()](VFPS://Topic/_S8B1DG4T7) Path Improvements**
These two functions now allow using ~ in the path to specify the virtual root. Example: `Response.ExpandScript("~\testpage.wcs")` or `Response.ExpandScript("~\views\login.wcs")`. You can also call either function without a parameter and it will use the template that references the Physical path of the request.
* **[wwProcess::OnAuthenticated() and wwProcess::OnShowAuthenticationForm()](VFPS://Topic/_2LH0X06QN)**
Added additional features around authentication to make it easier to override the default authentication functionality. OnAuthenticated() is called when a user is authenticated either after logging in or after retrieving previous login information.OnShowAuthenticationForm() allows overriding the logic for displaying the authentication form so it's easy to hook in a custom form UI. The default form display now uses a customizable template so you might not have to modify code at all.
Hook methods that allow you to hook into the REST process call pipeline before and after a REST method is called. Allows modifying global parameters (like JsonServer.IsDebugMode) or examine and modify individual requests.
Flattens a multi-line SQL into a single line that FoxPro can execute at runtime using Macro expressions. Useful to allow you to write SQL with TEXT/ENDTEXT. Used internally in wwBusiness::Execute and wwBusiness::Query.
Returns .T. if the provided value is a number, or a string that contains only digists and decimal/seperators (. and ,). Useful in many data binding scenarios to determine validity of number input.
* **[wwHtmlHelpers HtmlBindingError](VFPS://Topic/_4FH18RAAA)**
This function can be used to display binding errors for input controls. By providing a control id and ValidationError collection errors can be displayed explicitly in relation to the related parent control.
* **[wwHtmlHelpers HtmlPager](VFPS://Topic/_4FM0T4NF6)**
New HtmlPager() function that can be used to place a pager on the stage by specifying a page number, total pages and a base navigation URL.
* **[New wwJsonServiceClient Wrapper Class for Calling API Services](VFPS://Topic/Class%20wwJsonServiceClient)**
This class provides an abstract `CallService()` method that automatically handles JSON serialization of parameters, making the HTTP call, and deserializing the JSON result back into a FoxPro class. The method makes the HTTP calls and handles all errors.
* **[wwJsonSerializer::FormattedOutput Flag](VFPS://Topic/_S8X02FE4U)**
Added a flag to automatically format all output from Serialize() to be pretty formatted. This is a post-processing operation, so it adds some additional overhead, but can provide a nicer development experience.
<div class="updatenotice" style="margin-left: 0;margin-right">
#### @icon-warning Breaking Changes in v6.0
* **Web Connection .NET Module compiled in .NET 4.0**
We've changed the compilation mode of the .NET Module to .NET 4.0 which means that if you are running with .NET 2.0 on your server you need to switch (and possibly install) .NET 4.0. .NET 4.x is the default installed version on most servers and desktops today and 4.0 is forward compatible with 4.5 and later versions which improves stability and performance.
* **Legacy wwPageResponse Methods Removed**
The default response class used in new projects is the **wwPageResponse** class. This class has been trimmed down, and has removed all legacy functions that modified headers, generated cursors and others. It removes the `ContentTypeHeader()`, `ShowCursor()`,`DbfPopup()`, `HtmlFooter()`,`HtmlHeader()` the various form control functions and more. If you are using an old application that uses these function you can switch to use the wwPageResponse40 class instead which is a subclass that includes all the legacy function. Override `wwProcess::cResponseClass` and specify **[wwPageResponse40](VFPS://Topic/_1O80YQ37Z)** and make sure you set the `#define INCLUDE_LEGACY_RESPONSEMETHODS .T.` in **wconnect_override.h**.
* **wwProcess::nPageScriptMode Default Change**
The default setting of `nPageScriptMode` which determines how non-method loose script files with a mapped extension are processed has changed. The new default value is 3 - Scripts which uses `Response.ExpandScript()`. Other Values: 2 - Web Control Framework Pages, 1 - Templates (`Response.ExpandTemplate()`).
* **wwProcess::ErrorMsg() requires an extra lcIcon Parameter**
The ErrorMsg() function now receives an extra parameter to receive an Icon that is used from FontAwesome. If you are overriding the ErrorMsg() function in your own applications, make sure to add the extra parameter signature.
* **[wwJsonSerializer::Serialize "cursor:TCursor" now returns a raw Array](VFPS://Topic/wwJsonSerializer%3A%3ASerialize)**
wwJsonSerializer now serializes cursors that are created with `cursor:CursorName` syntax to a straight array. Previously this generated an object with a `Count` and `Rows` properties while `cursor_rawarray:CursorName` generated a raw array. The `cursor:CursorName` syntax now has the same behavior as the `cursor_rawarray:CursorName` syntax, which still works, but it is deprecated in favor of the shorter and more logic syntax.
* **wwSession Table Length changed to VarChar(17)**
We've added a new wwSession unique ID generation algorithm that generates longer and random ids which requires a wider field. Also changed the Fox and SQL types to VarChar so the data is no longer returned with trailing spaces. To update delete wwSession.dbf and let it recreate. For SQL either change the ID field to varchar(17) and update the Sql Scripts to reflect the new width or re-run the SQL Server configuration script from the Console.
* **wwDotnetBridge default .NET Version changed to .NET 4**
Changed the default version that wwDotnetBridge uses if no version is specified to Version 4.0 (which includes all 4.x versions including 4.5 and 4.6). If you want to use .NET 2.0 explicitly pass `CREATEOBJECT("wwDotnetBridge","V2")`. We recommend you always specify your version **explicitly** anyway and remember only the first load determines the runtime loaded.
A disk path. Any path prefixed with ~\ replaces the ~\ to the Root path of the server or virtual (ie. using Request.GetApplicationPath()).
ResolveUrl relies on the cUrlBasePath property which is used to fix up paths. By default this value is set from the Process specific Configuration object defined in your Mainline PRG file. If you don't have a process level configuration object or the object is not hooked up or doesn't contain a cVirtualPath property the base path will end up blank and result in invalid Urls. To fix either assign cUrlBase in your Process startup code (OnProcessInit or Init or cUrlBasePath assignment) or make sure you create a configuration object and attach it to the server configuration object.
See also:Class wwProcess
Comment or report problem with topic