OData 无法在具有端口地址转换(端口转发)的路由器后面工作

OData not working behind router with port address translation (port forwarding)

我有两个应用程序托管在不同的计算机上:

我的路由器 (my.server.com) 配置为转发以下请求:

我使用 Microsoft.OData.Client 库生成 OData 上下文并从 MVC 控制器使用它。所有 CRUD 操作都运行良好,除非我尝试更新从该上下文中检索到的实体。

var entity = await context.Entities.ByKey(id).GetValueAsync();
if (entity != null)
{       
    entity.Property = newValue;

    context.UpdateObject(entity);
    await context.SaveChangesAsync();
}

在 SaveChangesAsync 方法中,我得到一个 "unable to connect to the remote server" 异常。我首先查看了这个异常并看到它试图在端口 80 而不是 10080 上访问 my.server.com。当我查看实体变量上下文时,它说:

似乎 APP1 说的是 "Hello, my entities are accessible from [Entities->Uri]" 而 Microsoft.OData.Client 说的是 "Mine are accessible from [BaseUri]" 但以下代码有效:

public async Task<ActionResult> Edit(Entity entity)
{
    context.AttachTo("Entities", entity);
    context.UpdateObject(entity);
    await context.SaveChangesAsync();

    return RedirectToAction("Details", new { id = entity.Id }); 
}

您正在向 :80 端口上托管的应用程序发送 url 带有 header 的请求,其中包括 :10080 之类的端口。使用 NAT,进行端口修改 (PAT),但不更正 URL 上的端口可能是问题的根源。换句话说,您要求路由器与 Smith 先生交谈,然后路由器将请求发送给 Johnson 先生。问题是约翰逊先生看到这个请求是给史密斯先生的,所以他不喜欢。

您应该在您的 LAN 机器的相同端口中托管服务或在防火墙中打开相同的端口并进行基本 NAT(无端口映射)以避免接收请求的服务器端口与 URL 请求中的端口。