使用 OData 连接服务在 Blazor 客户端应用程序中使用 OData

2024-01-12

  1. 创建了 netstandard2.1 blazor Web 程序集项目。
  2. 将 Odata Connected Service (V.0.10.0) 添加到同一项目。
  3. 生成 OData 代理类。
  4. 从 Razor 页面的 Task OnInitializedAsync() 方法调用 odata 服务

从 Razor 页面调用 OData 服务:

protected override async Task OnInitializedAsync()
{
    await base.OnInitializedAsync();
    var context = new Container(new Uri("http://localhost/odata"));
    var result = await context.Students.ExecuteAsync();
}

浏览器异常:

blazor.webassembly.js:1 crit: Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100]
      Unhandled exception rendering component: Operation is not supported on this platform.
System.PlatformNotSupportedException: Operation is not supported on this platform.
  at System.Net.WebProxy.CreateDefaultProxy () <0x35560a0 + 0x00008> in <filename unknown>:0 
  at System.Net.Configuration.DefaultProxySectionInternal.GetSystemWebProxy () <0x3555f80 + 0x00000> in <filename unknown>:0 
  at System.Net.Configuration.DefaultProxySectionInternal.GetDefaultProxy_UsingOldMonoCode () <0x3555ed8 + 0x00000> in <filename unknown>:0 
  at System.Net.Configuration.DefaultProxySectionInternal.GetSection () <0x3555cd8 + 0x0002a> in <filename unknown>:0 
  at System.Net.WebRequest.get_InternalDefaultWebProxy () <0x3555a20 + 0x00034> in <filename unknown>:0 
  at System.Net.HttpWebRequest..ctor (System.Uri uri) <0x3555460 + 0x000b6> in <filename unknown>:0 
  at System.Net.HttpRequestCreator.Create (System.Uri uri) <0x3554aa0 + 0x00004> in <filename unknown>:0 
  at System.Net.WebRequest.Create (System.Uri requestUri, System.Boolean useUriBase) <0x354cfd8 + 0x00116> in <filename unknown>:0 
  at System.Net.WebRequest.Create (System.Uri requestUri) <0x354cc00 + 0x00024> in <filename unknown>:0 
  at Microsoft.OData.Client.HttpWebRequestMessage.CreateRequest (System.String method, System.Uri requestUrl, Microsoft.OData.Client.DataServiceClientRequestMessageArgs args) <0x353fd18 + 0x00006> in <filename unknown>:0 
  at Microsoft.OData.Client.HttpWebRequestMessage..ctor (Microsoft.OData.Client.DataServiceClientRequestMessageArgs args) <0x353f750 + 0x0006e> in <filename unknown>:0 
  at Microsoft.OData.Client.RequestInfo.CreateRequestMessage (Microsoft.OData.Client.BuildingRequestEventArgs requestMessageArgs) <0x353a6d0 + 0x0016a> in <filename unknown>:0 
  at Microsoft.OData.Client.ODataRequestMessageWrapper.CreateRequestMessageWrapper (Microsoft.OData.Client.BuildingRequestEventArgs requestMessageArgs, Microsoft.OData.Client.RequestInfo requestInfo) <0x353a0b0 + 0x0000e> in <filename unknown>:0 
  at Microsoft.OData.Client.ODataMessageWritingHelper.CreateRequestMessage (Microsoft.OData.Client.BuildingRequestEventArgs requestMessageArgs) <0x3539d68 + 0x0000a> in <filename unknown>:0 
  at Microsoft.OData.Client.DataServiceRequest.CreateExecuteResult (System.Object source, Microsoft.OData.Client.DataServiceContext context, System.AsyncCallback callback, System.Object state, System.String method) <0x3511280 + 0x00192> in <filename unknown>:0 
  at Microsoft.OData.Client.DataServiceRequest.BeginExecute (System.Object source, Microsoft.OData.Client.DataServiceContext context, System.AsyncCallback callback, System.Object state, System.String method) <0x3507818 + 0x00018> in <filename unknown>:0 
  at Microsoft.OData.Client.DataServiceQuery`1[TElement].BeginExecute (System.AsyncCallback callback, System.Object state) <0x3507610 + 0x0005a> in <filename unknown>:0 
  at System.Threading.Tasks.TaskFactory`1[TResult].FromAsyncImpl (System.Func`3[T1,T2,TResult] beginMethod, System.Func`2[T,TResult] endFunction, System.Action`1[T] endAction, System.Object state, System.Threading.Tasks.TaskCreationOptions creationOptions) <0x3506d10 + 0x00188> in <filename unknown>:0 
  at System.Threading.Tasks.TaskFactory`1[TResult].FromAsync (System.Func`3[T1,T2,TResult] beginMethod, System.Func`2[T,TResult] endMethod, System.Object state) <0x34fd5f8 + 0x00014> in <filename unknown>:0 
  at Microsoft.OData.Client.DataServiceQuery`1[TElement].ExecuteAsync () <0x34fce38 + 0x00028> in <filename unknown>:0 
  at BlazorClientApp2.Pages.Index.OnInitializedAsync () [0x00094] in ..\Pages\Index.razor:12 
  at Microsoft.AspNetCore.Components.ComponentBase.RunInitAndSetParametersAsync () <0x2ec1cd8 + 0x0013a> in <filename unknown>:0

如何克服这个问题? 使用Odata Connected Service的主要原因是利用它的财产跟踪功能。


微软.OData.Client 7.8.1:

工作样本 https://github.com/tomasfabian/Joker/tree/master/Samples/Blazor.WebAssembly

//Program.cs Main
var httpClient = new HttpClient {BaseAddress = new Uri(builder.HostEnvironment.BaseAddress)};

builder.Services.AddScoped(sp => httpClient);

Set Http请求传输模式 to HttpRequestTransportMode.HttpClient在 ODataServiceContext 中:

  public class ODataServiceContext : DataServiceContext
  {
    public ODataServiceContext(Uri serviceRoot, HttpClient httpClient)
      : base(serviceRoot, ODataProtocolVersion.V4)
    {
      if(httpClient != null)
        HttpRequestTransportMode = HttpRequestTransportMode.HttpClient; 
      
      if (EdmModel == null)
      {
        switch (HttpRequestTransportMode)
        {
          case HttpRequestTransportMode.HttpClient: 
            Format.LoadServiceModel = () => GetServiceModelAsync(httpClient).Result;
            break;
          case HttpRequestTransportMode.HttpWebRequest: 
            Format.LoadServiceModel = () => GetServiceModel(GetMetadataUri());
            break;
        }
        
        Format.UseJson();
      }
      else
      {
        Format.UseJson(EdmModel);
      }
    }
    
    public static IEdmModel EdmModel { get; set; }

    //WASM support
    public static async Task<IEdmModel> GetServiceModelAsync(HttpClient httpClient)
    {
      using (var stream = await httpClient.GetStreamAsync("$metadata"))
      using (var reader = XmlReader.Create(stream))
      {
        return EdmModel = CsdlReader.Parse(reader);
      }
    }

    public IEdmModel GetServiceModel(Uri metadataUri)
    {
      var request = WebRequest.CreateHttp(metadataUri);

      using (var response = request.GetResponse())
      using (var stream = response.GetResponseStream())
      using (var reader = XmlReader.Create(stream))
      {
        return CsdlReader.Parse(reader);
      }
    }

    private DataServiceQuery<Student> student;

    public DataServiceQuery<Student> Students => student = student ?? CreateQuery<Student>("Students");
  }
//Blazor Wasm Component
using System.Net.HttpClient;

[Inject]
public HttpClient HttpClient { get; set; }

[Inject]
public NavigationManager NavigationManager { get; set; }

    protected override async Task OnInitializedAsync()
    {
      await base.OnInitializedAsync();

      Uri serviceRoot = NavigationManager.ToAbsoluteUri("/odata"); //new Uri("http://localhost/odata")

      var dataServiceContext =
        new ODataServiceContext(serviceRoot, HttpClient);

      var result = await dataServiceContext.Students.ExecuteAsync();
    }

Microsoft.OData.Client 7.6.4(

有了这个包Microsoft.OData.Extensions.Client你将能够拦截dataServiceContext.Configurations.RequestPipeline.OnMessageCreating :

//Program.cs Main
var httpClient = new HttpClient {BaseAddress = new Uri(builder.HostEnvironment.BaseAddress)};

builder.Services.AddTransient(sp => httpClient);

builder.Services.AddODataClient().AddHttpClient(httpClient);

//Blazor Wasm Component

using Microsoft.OData.Extensions.Client;

[Inject]
public IODataClientFactory ClientFactory { get; set; }
    
[Inject]
public NavigationManager NavigationManager { get; set; }

    protected override async Task OnInitializedAsync()
    {
      await base.OnInitializedAsync();

      Uri serviceRoot = NavigationManager.ToAbsoluteUri("/odata"); //new Uri("http://localhost/odata")

      var dataServiceContext =
        ClientFactory.CreateClient<ODataServiceContext>(serviceRoot);

      var result = await dataServiceContext.Students.ExecuteAsync();
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 OData 连接服务在 Blazor 客户端应用程序中使用 OData 的相关文章

随机推荐

  • 使用自定义 IP 从 Docker 注册到 Eureka

    我在 Docker VM 中运行 Spring Cloud Eureka 我有注册到它的服务 但它们使用 Docker VM 内部的 IP 地址 但为了能够正确使用它们 我需要它们使用我可以从 VM 外部访问的 IP 地址 例如 在我的虚拟
  • SQLite3 导入 CSV 并排除/跳过标头

    我正在尝试将我的数据文件 其中有十几个左右 放入 SQLite 中的表中 每个文件都有一个标题 我将在未来的一年中多次收到它们 所以我想 当我收到文件时 避免编辑每个文件以删除标头 避免依靠 shell 脚本或 Python 来执行此操作
  • Outlook Javascript API - window.open 无法在 Outlook 2016 桌面/Windows 上运行

    我有一个用新的 JavaScript API 编写的 Office 加载项 其中有一个 JS 函数 经过一些逻辑后 该函数在新窗口中打开一个 Web 应用程序window open url blank 当从 Outlook Web 中的加载
  • 我可以设置 Javascript 对象的类型吗?

    我正在尝试遵循 Doug Crawford 的 超级构造函数 模式 使用 Javascript 的一些更高级的 OO 功能 但是 我不知道如何使用 Javascript 的本机类型系统设置和获取对象的类型 我现在的情况是这样的 functi
  • CSS:如何摆脱默认窗口“填充”?设置为 100% 宽度的元素不会到达窗口边框

    所以我有一个直接放置在 body 内部的元素 div Some stuff div Other stuff 以下是使用的CSS body text align center header margin auto 因此 header div
  • 使用 Jeff Atwood 的示例清理 HTML

    我正在使用 Jeff Atwood 发现的代码清理我的 Htmlhere http refactormycode com codes 333 sanitize html 但我遇到的问题是当我将 Markdown 链接输入表单时 它们被删除
  • 使用java.util.logging登录控制台

    我只想使用 java util Logging 登录控制台 Logger log Logger getLogger my logger log setLevel Level ALL ConsoleHandler handler new Co
  • 从另一个 docker 容器连接到 Mongodb docker 容器

    我正在尝试从运行我的节点js代码的另一个docker容器连接在docker容器中运行的mongo DB 所以我使用以下命令运行 MongoDB docker docker run name my local mongo v mongo da
  • 从数据库下载exe文件

    我已经将一些 exe 文件上传到数据库中 因为我不希望它们可供公开访问 我尝试使用链接按钮和通用处理程序来使用以下代码提供文件 Context Response Clear Context Response ContentType appl
  • 请求 ruby​​-on-rails 应用程序会出现 Psych::BadAlias 错误

    我从应用程序目录运行 Rails 服务器 但是当我尝试从浏览器发出请求时 http localhost 3000 我收到以下错误 Psych BadAlias 无法加载Rails application database configura
  • WebRTC 连接在本地网络之外无法工作

    我们对 webrtc 双向视频和音频流进行了以下设置 Mobile Android应用程序使用谷歌网络RTC https webrtc org 实现java包装器 测试了这两个库 implementation org webrtc goog
  • Pandas 将字典列表分解为行

    拥有这个 items name 0 a 2 b 1 a 4 b 3 this 1 a 2 b 1 a 4 b 3 that 但希望将字典对象列表分解为 展平 为实际行 如下所示 a b name 0 2 1 this 1 4 3 this
  • Angular 2 Promise/Observable 链两个事件?

    我想知道是否可观察到的 or promise可用于 Angular 2 中的以下用例 有两个异步上传任务 我想知道如何检测这两项任务都已完成 我的上传任务 实现于promise但它很容易改变为可观察到的如果需要的话 是这样的 myServi
  • 在 macOS 中通过命令行与 Siri 交互

    我在手机和手表上使用 Siri 随时随地创建提醒 当我在办公室时 我不想使用 Siri 打扰安静 因此我通常使用与 提醒 应用程序集成的 Alfred 工作流程 或者直接使用 提醒 应用程序 然而 两者都有一个相当笨拙的界面 如果我可以在命
  • Zbar SDK - 缺少所需的架构 x86_64

    我在最近的 Xcode 5 1 中构建应用程序时遇到了一个问题 编译失败 并出现 架构 x86 64 的未定义符号 错误 我使用有效架构构建我的项目 armv7 armv7s 和 arm64 切换到最新的环境 Xcode 后 我在相同的架构
  • 随机化一个 BigInteger

    I m looking to randomize a BigInteger The intent is to pick a number from 1 to 8180385048 Though from what I noticed the
  • 运行 gulp 任务时如何解决“在 MakeCallback 中使用域属性已被弃用”警告?

    我正在使用带有 gulp 的节点来运行一些构建任务 直到几天前 这一切都还顺利 现在 我假设在升级 更新后 不确定是哪一个 我相信这是节点从 14 4 更新到 14 5 我不断收到此警告 DEP0097 DeprecationWarning
  • 使用 webpack、Threejs 示例和 TypeScript?

    我在将 Threejs 示例 如 EffectComposer 或 Detector 中的内容与 webpack 和 typescript 一起使用时遇到了很多麻烦 先把相关的 d ts文件全部存在并通过安装tsd 我的问题是让 webpa
  • Oracle:“= ANY()”与“IN ()”

    我刚刚在 ORACLE SQL 中偶然发现了一些我很好奇的东西 不确定其他中是否也有 我在这里作为维基询问 因为很难尝试在谷歌中搜索符号 我刚刚发现 当根据一组值检查一个值时 您可以执行以下操作 WHERE x ANY a b c 与通常的
  • 使用 OData 连接服务在 Blazor 客户端应用程序中使用 OData

    创建了 netstandard2 1 blazor Web 程序集项目 将 Odata Connected Service V 0 10 0 添加到同一项目 生成 OData 代理类 从 Razor 页面的 Task OnInitializ