簡體   English   中英

端點和 WSHttpBinding 以編程方式

[英]Endpoint and WSHttpBinding programmatically

我正在嘗試將endpointwshttpbinding配置移動到 ac# 文件,以便我可以在運行時更改端點地址(從下拉列表、進程等中選擇)。 但是,在創建WsHttpBinding對象、 EndpointAddress對象並將它們傳遞給我的客戶端之后。 它將拋出以下異常:

System.ServiceModel.FaultException: 調用者未經服務驗證

如果用戶憑據不正確,這與我得到的異常相同。 但是,它們並沒有從使用Web.config文件更改為以編程方式創建這些配置選項。

Web.config(有效):

<binding name="myService" maxReceivedMessageSize="2147483647">
    <readerQuotas
        maxDepth="2147483647"
        maxStringContentLength="2147483647"
        maxArrayLength="2147483647"
        maxBytesPerRead="2147483647"
        maxNameTableCharCount="2147483647" />

    <security mode="TransportWithMessageCredential">
        <transport clientCredentialType="None" />
        <message clientCredentialType="UserName" establishSecurityContext="false" />
    </security>
</binding>


<client>
    <endpoint
        address="https://address/myservice.svc"
        binding="wsHttpBinding"
        bindingConfiguration="myService"
        contract="MyService.IMyService"
        name="myService"
    />
</client>

MyService service = new MyService();
service.username = "user";
service.password = "pass";
//Success

以編程方式(不起作用):

WSHttpBinding wsHttp = new WSHttpBinding();
wsHttp.MaxReceivedMessageSize = 2147483647;
wsHttp.ReaderQuotas.MaxDepth = 2147483647;
wsHttp.ReaderQuotas.MaxStringContentLength = 2147483647;
wsHttp.ReaderQuotas.MaxArrayLength = 2147483647;
wsHttp.ReaderQuotas.MaxBytesPerRead = 2147483647;
wsHttp.ReaderQuotas.MaxNameTableCharCount = 2147483647;
wsHttp.Security.Mode = SecurityMode.TransportWithMessageCredential;
wsHttp.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
wsHttp.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
wsHttp.Security.Message.EstablishSecurityContext = false;

EndpointAddress endpoint = new EndpointAddress("https://address/myservice.svc");

MyService service = new MyService(wsHttp, endpoint);
service.username = "user";
service.password = "pass";
//System.ServiceModel.FaultException: The caller was not authenticated by the service

我試過遵循教程/查看答案,但我無法弄清楚。

我的解決方案

保持綁定不變。

更改端點以便沒有地址

<client>
  <endpoint
    binding="wsHttpBinding" bindingConfiguration="myService"
    contract="MyService.IMyService" name="myService" />
</client>

通過更改 Uri 對象在運行時更改端點並將端點名稱作為第一個參數傳遞給您的服務

Uri uri = new Uri("https://address/myservice.svc");
var address = new EndpointAddress(uri);
service= new MyService("myService", address);
service.username = "user";
service.password = "pass";

您可以刪除 app.config 中的所有內容 - 因此沒有綁定或界面信息。

你的運行時代碼是這樣的:

//create an endpoint address
var address = new EndpointAddress("http://localhost:51353/EmployeeService.svc");

//create a WSHttpBinding
WSHttpBinding binding = new WSHttpBinding();

//create a channel factory from the Interface with binding and address
var channelFactory = new ChannelFactory<IEmployeeService>(binding, address);

//create a channel
IEmployeeService channel = channelFactory.CreateChannel();

//Call the service method on the channel
DataSet dataSet = channel.SelectEmployees();

僅供參考,這是我的 app.config:

<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup> 
</configuration>

/************ 你可以把它簡化成這樣:******************************** ***/

var factory = new ChannelFactory<IEmployeeService>(new WSHttpBinding());
var channel = factory.CreateChannel(new EndpointAddress("http://localhost:51353/EmployeeService.svc"));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM