我有一个资源
/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系统如何完全避免这个问题有一些想法,我会很高兴听到它们.
我有一个可通过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服务实例?
我有一个现有的 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) 我正在为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.
有谁能说出为什么这是一个愚蠢的想法?我有一种唠叨的感觉,这有点臭...
注意:我显然不建议每个新版本的服务都在新的命名空间中.据推测,我将尽可能多地进行非破坏性的界面更改,但我知道我将在所有数据建模中可能需要进行重大改写.
我理解汇编版本控制等,但我认为这个问题与那种版本控制相关.但我可能是错的.
api ×1
asp.net-mvc ×1
aws-batch ×1
c# ×1
iis ×1
named-pipes ×1
oop ×1
rest ×1
wcf ×1
web-services ×1