WHAT’S NEW IN OFFICE 365 (August 2018)

With a little over 6 weeks to go until Ignite and the Business Application Summit last month we are sure to be getting some new features and enhancements galore over the next couple months.  As an FYI: Microsoft has made most of, if not all the Business Applications Summit sessions available on demand. If you’re thinking about how your organization can take advantage of the Microsoft Power Platform (Power BI, PowerApps, Flow and Dynamics 365) it’s worth looking through the sessions.

Continue reading “WHAT’S NEW IN OFFICE 365 (August 2018)”

MS Flow and Azure: Creating Parent and Sub sites

The Assignment

Recently we were asked by a client to develop a MS Flow that creates a sub site when users enter a new item into a SharePoint list. What we found was there’s no simple, out of the box way to have the new sub site inherit the top navigation of the parent site. As a result, we needed to create an Azure Function to preform this function.

I was tasked with developing the Azure Function and calling it from the MS Flow. This assignment seemed fairly straightforward at the beginning – follow along with some pretty detailed tutorials and botta-boom, you are done. This couldn’t have been farther from the truth.

The tutorials I used are listed below, along with the specific code for inheriting a top navigation.

Tutorials

Creating an Azure Function

Registering the Azure Function with Azure Active Directory

Calling CSOM from the Azure Function

Call an Azure Function from Microsoft Flow

Code for Inheriting Top Navigation


dynamic data = await req.Content.ReadAsAsync();

string webUrl = data?.webUrl.ToString() ?? "";

using (var ctx = await csomHelper.GetClientContext(webUrl))

{

var web = ctx.Web;

ctx.Load(web, w => w.Navigation);

ctx.ExecuteQuery();

web.Navigation.UseShared = true;

ctx.ExecuteQuery();

}

Lessons Learned

Adding to my false sense of confidence, creating the Azure Function went off without a hitch. I was able to follow along with the tutorial without any issues, and before I knew it I had created an Azure Function. It is important to note that when you are creating your Function App, you will want to opt out of Application Insights. If you don’t, an Application Insight will automatically be built for your Function App. This is a billable service, so be prepared to pay if you forget this step!

After creating your Azure Function, you’ll need to register it with the Azure Active Directory. This is where the process got frustrating. The first thing to note is that the instructions are for users who operate Windows 10. If you are using an older version of Windows, you will not be able to use the PowerShell commands for creating the Certificate. Instead, you will have to revert to MakeCert commands.

The second, even more maddening issue is the quirkiness of the document editor that is used to edit the app registration manifest. The author of the tutorial goes so far as to calling the editor evil. I couldn’t agree with him more.

Not only does the editor throw out mysterious errors, but further research proves that their meanings don’t match their corresponding  titles. Don’t edit the manifest in the editor! Instead, download it, edit it in your text editor, and upload it back into the manifest editor. Then there’s the mysterious “keyValueMustBeNull” error. If you get this, simply create a new GUID and that should resolve the issue.

After navigating through all that madness, I was lured back into a feeling of confidence. Setting up the Azure Function to call CSOM went smoothly. There was one small step missing in the tutorial though: When creating the csomHelper.csx file, in addition to the changes noted by the tutorial author, make sure to plug in your Function Name in the certPath. I also recommend copying the code from the gist at the top of the blog, as it is slightly different from the code in the blog.

The roller coaster ride continued as I moved on to calling an Azure Function from MS Flow. I was not able to create a custom connector that worked successfully. During the “Prepare Security Configuration” step, my drop down did not show “API Key” as an option. I created the connector two different ways: Once by choosing “None” in the drop down, which did not give me a place to enter the API Key; And once by leaving the option blank, which did allow me to enter the API Key. Both resulted in the following error upon running the flow: “Unable to match incoming request to an operation.” I finally scrapped the idea of using a custom connector. Instead, I set up an HTTP call in the MS Flow using the API Key in the query parameters.

All in all, there were many great lessons learned. Hopefully, these observations help you to avoid all the headaches and frustration I had to endure.

 

MS Teams and Skype for Business transition is coming: Are you ready?

Administrators of Office 365 be warned…the Teams/Skype for Business migrations are going to be coming and you need to start being proactive sooner rather than later.  Most of us have already got the “Teams & Skype” admin center but we can still utilize the Services & add-ins section to manage tenant wide settings we don’t have access to in the new admin center. As you may have already guessed that’s going to be changing, quickly.  Continue reading “MS Teams and Skype for Business transition is coming: Are you ready?”

Postman – Using Environments and Tokens

Rick Herrmann

Postman is an incredibly  useful tool for testing API’s.  I’ve been using it for a few years now and have found some features that make it a breeze to work with when it comes to secured API’s. It’s good for handling different environments as well.

Login and Tokens

A common pattern we use with our API’s is to use Javascript Web Tokens(JWT’s) for authentication. To work with this in Postman, I typically have a /login post call which returns a token. Then for any other calls to that API, I manually copy the returned token, and set the Authorization header to “Bearer <token>”. Although this works, it’s a pain when the login token expires and I have to copy a new token to the Authorization header for every saved API call.  For an API where you have a lot of endpoints saved, updating all the Authorization headers can become tedious. Continue reading “Postman – Using Environments and Tokens”

Xamarin vs. PhoneGap

I recently had the opportunity to write a Xamarin app for the first time.  It wasn’t Mike Berrymananything complicated – basically a CRUD application that would list items for the user with the option to add, edit and delete – but it afforded me a chance to compare and contrast with the way I’ve been writing mobile apps for the past few years. Continue reading “Xamarin vs. PhoneGap”

What’s New In Office 365 (July 2018)

It’s been another busy month for Office 365 updates.  Many of the updates that rolled out Duane Odumwere ahead of schedule which can be nice for folks that were waiting on a specific update to implement a solution.  However, it’s nice when the Office 365 Roadmap is accurate😊.

Microsoft 365 Admin Center

This one’s been in the pipeline for some time but if you haven’t checked it out yet be prepared for some changes.  Content is still very similar so it’s not a terribly difficult adjustment but anything with Administration rights in Office 365 should get familiar with the new layout sooner rather than later at https://admin.microsoft.com. Continue reading “What’s New In Office 365 (July 2018)”

Angular – Refreshing a Route with Parameters

Angular routing is pretty nifty.  Going into how it works is beyond the scope of this post Mike Berryman(and there’s plenty of resources out there doing just that), but suffice it to say if you’re working on an Angular application, you’re using Angular’s routing.

One of the things Angular’s routing does to increase performance is reusing a Component for a route that has already been instantiated.  Say you have a Component, “MyComponent”, tied to a route, “/MyPath”.  “MyComponent” isn’t created until the user actually navigates to the “/MyPath” route.  That makes perfect sense – why instantiate a component that doesn’t need to be used yet?  What’s interesting about this design, though, is how parameters factor into it.  Let’s say you add a parameter to your “/MyPath” route, making the route “/MyPath/:id”.  The first time the user navigates to some version of this route, let’s say “/MyPath/1”, “MyComponent” will be instantiated (with the id parameter set to 1).  Then if, without leaving that route, the user changes only the parameter – for example, there’s a link in the component to go to “/MyPath/2”, “MyComponent” will not be recreated.  In fact, if not handled correctly, to the user nothing will have changed.  It will still look like they’re seeing the “/MyPath/1” version of “MyComponent”. Continue reading “Angular – Refreshing a Route with Parameters”