OData无法在路由器后面进行端口地址转换(端口转发)

时间:2015-06-01 13:40:04

标签: odata asp.net-web-api2 firewall nat portforwarding

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

  • PC1上的OData网站APP1
  • PC2上的基本MVC应用程序APP2

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

  • *:10080到PC1:80
  • *:20080 to PC2:80

我使用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方法上,我收到“无法连接到远程服务器”的异常。我首先查看了这个异常并看到了它,它试图访问端口80上的my.server.com而不是10080.当我查看实体变量上下文时,它说:

APP1似乎在说“你好,我的实体可以从[Entities-> Uri]访问”,而Microsoft.OData.Client说“我可以从[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 }); 
}

1 个答案:

答案 0 :(得分:0)

您正在向包含:10080端口的标头发送包含:80端口托管的应用的网址请求。使用NAT,端口修改(PAT),但不纠正URL上的端口可能是您的问题的根源。换句话说,你要求路由器与史密斯先生交谈,然后路由器将请求发送给约翰逊先生。问题是约翰逊先生认为请求是针对史密斯先生的,所以他不喜欢它。

您应该在LAN LAN计算机的同一端口中托管服务,或者在防火墙中打开相同的端口并执行基本NAT(无端口映射),以避免接收请求的服务器端口与URL端口之间发生冲突你的要求。