This post was originally published here
In my previous blog, I spoke about one of the issues we encountered during our support. In this blog, I will specifically be talking about the custom widgets in BizTalk360, which a lot of our customers use to display data that is important to them. Users are able to create custom widgets and associate them with a dashboard. Custom widgets allow integration with BizTalk360’s own API’s, as well as third-party API’s.
The below code in a custom widget shows analytical data in graphical form. In recent times, we received a support case where the customer was trying to create a custom widget referencing the blog. Following should be the result of the custom widget in the dashboard.
But the customer ended up with the below error after integrating the custom widget.
A script for the custom widget:
<script> //URL used to get JSON Data for the Charts this.URL = 'http://rawgit.com/cyberkingvb/CustomWidgetWithChart/master/sales2016.json'; //Refresh interval in milliseconds 60000 milliseconds = 60 seconds this.REFRESH_INTERVAL = 60000; //flag to check if widget should auto Refresh this.AUTO_REFRESH_ENABLED = true; //Highcharts Options this.HIGHCHART_OPTIONS = { chart: { type: 'line', zoomType: 'x' }, exporting: { enabled: false }, credits: { enabled: false, title: '', style: { display: 'none' } }, title: { text: 'Sales of 2016' }, xAxis: { type: 'datetime' }, yAxis: { min:0, title: { text: 'Units' }, }, tooltip: { crosshairs: true, shared: true, valueSuffix: 'Units' }, legend: { enabled: false }, series: [{ name: 'Sales', data: [] }] }; this.widgetDetails = ko.observable(); this.error = ko.observable(null); var _this = this; var getdata = function() { $.getJSON(_this.URL, function (data) { _this.HIGHCHART_OPTIONS.series[0].data = data; _this.widgetDetails(_this.HIGHCHART_OPTIONS); _this.error(null); }).fail(function(errorObject,error) { console.log(errorObject); _this.error(errorObject); }); } //loading data for the first time getdata(); //handles auto refresh if(this.AUTO_REFRESH_ENABLED) setInterval(getdata, this.REFRESH_INTERVAL); </script> <!-- ko if: error() == null --> <div data-bind="highCharts: widgetDetails()" style="height:380px; width:700px"></div> <!-- /ko --> <!-- ko if: error() != null --> <div class="row"> <div class="col-md-offset-4 col-md-4 bg-danger"> <b> <p>Error occured while trying to fetch data </p> <span>Status : </span><span data-bind="text:error().status"></span><br> <span>Status Text : </span><span data-bind="text:error().statusText"></span> </b> </div> </div> <!-- /ko -->
Script Explained
This code consists of 4 configuration variables.
URL
URL variable will allow you configure the API URL from where you fetch the JSON data. Based on the High charts options, the formatting for the data may also change. Here in the above example, the API returns the data as JSON array and date-time stamp as a Unix Timestamp.
AUTO_REFRESH_ENABLED
This flag determines if your widget should be auto-refreshed or not. For instance, if the service call that feeds your chart is very expensive and you don’t want to call that every now and then, then you can probably disable this flag or set the refresh interval to a higher value.
REFRESH_INTERVAL
Refresh interval lets you configure the interval after which the widget data should be refreshed. Note that the interval is in milliseconds. So, if you want it to refresh every one minute then you should set the refresh interval to 60000. Note that for an auto-refresh to work, AUTO_REFRESH_ENABLED flag must be set to true.
HIGHCHART_OPTIONS
BizTalk360 uses High charts for all data analytics. We already have the underlying binding handler framework to apply the options and this makes analytic widget creation a lot easier. To modify the charts, you simply need to update the HIGHCHART_OPTIONS. In this example,
the “data” property inside series array (where the data is supposed to be) is left as an empty array intentionally. It will be filled with the data that is retrieved from the URL that you have specified. High charts support a variety of charts and you can follow this link to get the type of chart that you want to bring into your custom widget.
The line chart that we have created here can be converted into an Area chart or a Column chart by simply changing “type” under “charts” options in HIGHCHART_OPTIONS.
Investigation of the Issue
Initially, we suspected that the customer might not be able to fetch the JSON data using the http://rawgit.com/cyberkingvb/CustomWidgetWithChart/master/sales2016.json URL. When we asked to browse the URL and they could browse and view the results. So, the next step was to isolate the case at the customer end. Whenever such a situation arises we require more information about the customer’s environment, we would go for a web meeting with a screen sharing session. We went for the screen sharing session and we started with the basic troubleshooting steps like checking the configuration, environment etc.
At last, we found that the customer is using https://localhot/biztalk360 and he is trying to monitor http://rawgit.com/cyberkingvb/CustomWidgetWithChart/master/sales2016.json.
Using HTTPS, there is a security code being generated and shared to accept the information between computers. (Say, in client and server architecture). This keeps the information safe from the hackers.
They use the “code” on a Secure Sockets Layer (SSL), sometimes called Transport Layer Security (TLS) to send the information back and forth.
Resolution Provided
When the HTTP is used inside the HTTPS URL, the HTTPS expected a “code” from HTTP. When the response from the widget URL was coming without the code it threw the error message “Access is denied” on the widget.
Hence, It is not possible to create custom widgets with the cross-domain URL. If the HTTPS is used, all the related URL must use the HTTPS.
If you have any questions, contact us at [email protected]. Also, feel free to leave your feedback in our forum.