0
votes

Not sure what's changed exactly and causing this partial error (since it's not happening with retrieving the data) but after updating Microsoft.AspNet.WebApi.OData library to 5.3.x version, breeze has an issue with saving the data to OData controller. It's about the urls of the batch requests.

It can be reproduced with breeze's its own sample OData project as well;
http://www.breezejs.com/samples/breeze-web-api-odata

If you look at ExecuteRequestMessagesAsync method of the BatchHandler class, RequestUri property of the items contain OData route prefix two times.

Microsoft.AspNet.WebApi.OData library 5.2.2 url

http://localhost:55802/odata/TodoItems

Microsoft.AspNet.WebApi.OData library 5.3.1 url

http://localhost:55802/odata/odata/TodoItems

Any ideas how to solve this issue?

breeze version: 1.5.1

1

1 Answers

4
votes

Oh joy. Microsoft has changed their Web API OData implementation ... again

Thanks for digging in, @coni2k, and identifying the problem.

Fortunately, you do NOT have to patch Breeze. We deliberately expose the getRoutePrefix method so you can change it externally yourself to meet your needs.

In the following example, I've incorporated your suggestion in the body of the method.

var adapter = breeze.config.getAdapterInstance('dataservice', 'webApiOdata');
adapter.getRoutePrefix = getRoutePrefix531; // plug-in alternative for THIS adapter instance.

function getRoutePrefix531(dataService) {
    // Copied from breeze.debug and modified for Web API OData v.5.3.1.
    if (typeof document === 'object') { // browser
      var parser = document.createElement('a');
      parser.href = dataService.serviceName;
    } else { // node
      parser = url.parse(dataService.serviceName);
    }
    // THE CHANGE FOR 5.3.1: Add '/' prefix to pathname
    var prefix = parser.pathname;
    if (prefix[0] !== '/') {
        prefix = '/' + prefix;
    } // add leading '/'  (only in IE)
    if (prefix.substr(-1) !== '/') {
        prefix += '/';
    } // ensure trailing '/'
    return prefix;
  };

As I write we're not sure how to detect which version of Web API OData you're talking to which makes it difficult for us to say a priori which version of getRoutePrefix is right for your application.

Hope to figure this out eventually. Don't dare change the default to this new version because that would break every existing app that has to talk to an older version of Web API OData. Not sure how we can win this game. We'll look at it. Frustrating for now.