小编And*_*son的帖子

布尔REST结果的最佳实践

我有一个资源

  /system/resource
Run Code Online (Sandbox Code Playgroud)

我想问一下系统一个关于资源的布尔问题,这个问题无法通过客户端上的处理来回答(即我不能只获取资源并查看实际的资源数据 - 它需要在后端使用一些处理客户无法获得的数据).例如

  /system/resource/related/otherresourcename
Run Code Online (Sandbox Code Playgroud)

我希望这是返回true或false.有没有人有这种互动的最佳实践例子?

我想到的可能性:

  • 使用HTTP状态代码,没有返回正文(闻起来不对)

  • 返回纯文本字符串(True,False,1,0) - 不确定哪些字符串值适合使用,而且这似乎忽略了Accept媒体类型并始终返回纯文本

  • 为我的每个支持媒体类型提出一个布尔对象,并返回适当的类型(带有单个布尔结果的JSON文档,带有单个布尔字段的XML文档).然而,这似乎很笨拙.

我不是特别想深入讨论RESTful系统的真正含义等等 - 我在标题中使用了REST这个词,因为它最好地表达了我正在设计的系统的一般风格(即使我可能正在抚育更多的是通过Web而不是真正的REST).但是,如果有人对真正的RESTful系统如何完全避免这个问题有一些想法,我会很高兴听到它们.

api rest asp.net-mvc ruby-on-rails

15
推荐指数
2
解决办法
1万
查看次数

在IIS中托管WCF net.pipe绑定时控制命名管道的名称

我有一个可通过http和net.pipe访问的服务.它托管在IIS 7(Server 2008)中.我可能正在为同一台机器上的几个客户托管此服务的不同实例,因此HTTP设置为虚拟主机名等.这一切都正常.

我以为我会做类似的网名命名管道绑定 - 在命名管道基地址中使用某种形式的客户'virtualhostname',因此允许我使用不同的net.pipe urns访问不同的客户实例(我意识到网络.管道名称是URN不是URL,因此它们可以基本上是任意的但我认为我会遵循与HTTP地址类似的模式).

这是我的web.config

<service name="Administration" behaviorConfiguration="AdministrationBehavior">
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="normalWsBinding" contract="IAdministration" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    <endpoint address="" binding="netNamedPipeBinding" bindingConfiguration="normalNetNamedPipeBinding" contract="IAdministration" />
    <endpoint address="mex" binding="mexNamedPipeBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="http://virtualhostname.com/service" />
        <add baseAddress="net.pipe://virtualhostname.com/administration/service" />
      </baseAddresses>
    </host>
</service>
Run Code Online (Sandbox Code Playgroud)

但是,在访问服务的WSDL时 - IIS似乎忽略了net.pipe的基址.相反,我得到了机器的真实主机名,以及似乎完全由IIS格式化的net.pipe地址URN.

<wsdl:port name="NetNamedPipeBinding_IAdministration" binding="tns:NetNamedPipeBinding_IAdministration">
   <soap12:address location="net.pipe://realhostname/service/Administration.svc"/>
   <wsa10:EndpointReference>
       <wsa10:Address>net.pipe://realhostname.com/service/Administration.svc</wsa10:Address>
       <Identity>
          <Spn>host/realhostname.com</Spn>
       </Identity>
   </wsa10:EndpointReference>
</wsdl:port>
Run Code Online (Sandbox Code Playgroud)

由于无法控制net.pipe名称的形成方式,我将无法区分机器上的多个客户服务实例.有没有人知道如何在IIS环境中控制网络命名管道绑定URN?

(我在测试期间做了很多独立的net.pipe托管(即新的ServiceHost())所以我知道我的net.pipe绑定在IIS之外工作,并且允许控制使用的确切命名管道URN)

如果无法在IIS中控制名称 - 是否有人在同一台计算机上托管和访问多个单独的net.pipe服务实例?

iis wcf named-pipes

6
推荐指数
1
解决办法
7702
查看次数

AWS Step 无法正确调用具有复杂参数的 AWS Batch 作业

我有一个现有的 AWS Steps 编排,它通过 lambdas 执行 AWS Batch 作业。但是,AWS 最近添加了从一个步骤直接调用其他服务(如 AWS Batch)的功能。我很想使用这个新功能,但无法让它工作。

https://docs.aws.amazon.com/step-functions/latest/dg/connectors-batch.html

所以我想用来调用 Batch 的新步骤操作。

"File Copy": {
  "Type": "Task",
  "Resource": "arn:aws:states:::batch:submitJob.sync",
  "Parameters": {
     "JobName": "MyBatchJob",
     "JobQueue": "MySecondaryQueue",
     "ContainerOverrides.$": "$.lts_job_container_overrides",
     "JobDefinition.$": "$.lts_job_job_definition",
  },
  "Next": "Upload Start"
}
Run Code Online (Sandbox Code Playgroud)

请注意,我正在尝试使用 $. JSONpath 语法,以便动态地通过步骤传递参数。

当给出以下输入时

"lts_job_container_overrides": {
  "environment": [
    {
      "name": "MY_ENV_VARIABLE",
      "value": "XYZ"
    },
  ],
  "command": [
    "/app/file_copy.py"
  ]
},
"lts_job_job_definition": "MyBatchJobDefinition"
Run Code Online (Sandbox Code Playgroud)

我预计环境和命令值将传递给 AWS Batch 中的相应参数 (ContainerOverrides)。相反,AWS Steps 似乎试图将它们提升为顶级参数 - 然后抱怨它们无效。

{
 "error": "States.Runtime",
 "cause": "An error occurred while executing the …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services aws-step-functions aws-batch

6
推荐指数
1
解决办法
2327
查看次数

我应该将主要版本号放入C#/ Java命名空间吗?

我正在为WCF Web服务设计一组"服务"层对象(数据对象和接口定义)(将由第三方客户端使用,即不在内部,因此在我的直接控制之外).

我知道我不会完全正确地获得接口定义 - 并且我想要准备时间,因为我知道我将不得不介绍一组新的数据对象.然而,我所处的世界的现实是,我还需要同时运行我的第一个版本.

我的服务的第一个版本将具有http://host/app/v1service.svc的 URL

当新版本到来时,它们将存在于 http://host/app/v2service.svc

但是,当谈到数据对象和接口时,我很想将接口号的"主要​​"版本放入类的实际命名空间中.

namespace Company.Product.V1
{
   [DataContract(Namespace = "company-product-v1")]
   public class Widget
   {
        [DataMember]
        string widgetName;
   }

   public interface IFunction
   {
       Widget GetWidgetData(int code);
   }
}
Run Code Online (Sandbox Code Playgroud)

当需要对服务进行根本性改变时,我将介绍一些类似的课程

namespace Company.Product.V2
{
   [DataContract(Namespace = "company-product-v2")]
   public class Widget
   {
        [DataMember]
        int widgetCode;

        [DataMember]
        int widgetExpiry;
   }

   public interface IFunction
   {
       Widget GetWidgetData(int code);
   }
}
Run Code Online (Sandbox Code Playgroud)

我认为它的优点是我可以使用一组代码为两个接口版本提供服务,并在可能的情况下共享功能.这是因为我将能够将两个接口版本作为一组不同的C#对象引用.类似地,客户端可以同时使用两个接口版本,可能在一些遗留代码中使用V1.Widget,而新位移动到V2.Widget.

有谁能说出为什么这是一个愚蠢的想法?我有一种唠叨的感觉,这有点臭...

注意:我显然不建议每个新版本的服务都在新的命名空间中.据推测,我将尽可能多地进行非破坏性的界面更改,但我知道我将在所有数据建模中可能需要进行重大改写.

我理解汇编版本控制等,但我认为这个问题与那种版本控制相关.但我可能是错的.

c# oop web-services

5
推荐指数
1
解决办法
1125
查看次数