我正在使用只能通过网络和服务引用访问的第三方系统。在构建处理自动处理的Windows服务时,我发现如果解决方案使用了Web /服务引用,那么它们也必须在引用第一个解决方案的任何解决方案中进行设置。
有没有办法防止这种情况发生?我想创建一个类库,它将包含所有实际的API调用并将其用作NuGet包,而不必在未来添加对每个项目的引用。
编辑:以下是我目前如何调用API的示例:
internal class ApiAccess
{
private readonly Account_SSPSoapClient _apiAccount;
public ApiAccess()
{
_apiAccount = new Account_SSPSoapClient();
}
public string GetAccountId(string accountName)
{
return _apiAccount.GetID(accountName);
}
}
答案 0 :(得分:1)
这是一个问题,但它似乎不是问题。
在所有使用代码的项目中,您实际上并不需要服务引用 - 您只需要app.config中的一些信息。具体来说,绑定和端点地址。你可以将它们硬编码到你的代码中,然后你应该可以很好地引用它。
最简单的情况:
var request = new MyServiceRequest { /* set properties here */ };
var client = MyServiceReferenceClient(new BasicHttpBinding(), new EndpointAddress(@"https://my.service.com/path/to/service"));
var channel = client.ChannelFactory.CreateChannel();
var result = channel.MyService(request);
您需要在BasicHttpBinding
上设置一些参数以匹配app.config文件中的参数,并且URL也会出现。
请参阅this answer,了解默认情况下无效的原因。
编辑:对于您的代码,您只需将new Account_SSPSoapClient();
替换为以下内容:
new Account_SSPSoapClient(new BasicHttpBinding(), new EndpointAddress(@"https://my.service.com/path/to/service"));
其他所有内容都应该相同,但它会使用这些值而不是app.config值(这是没有参数的情况)。
在app.config文件中查找类似的内容:
<bindings>
<basicHttpBinding>
<binding name="LabelRecoveryBinding" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
其中的所有内容都对应于您可以在上面创建的BasicHttpBinding
对象上设置的属性 - 大多数是默认值,但您可能需要手动设置所有内容以确保安全。
同样,寻找
<client>
<endpoint address="http://153.2.133.60:48010/xoltws_ship/LBRecovery"
binding="basicHttpBinding" bindingConfiguration="LabelRecoveryBinding"
contract="UPSLabelRecoveryService.LabelRecoveryPortType" name="LabelRecoveryPort" />
</client>
告诉您要向new EndpointAddress
提供的网址。