我正在编写一个下面的代码来通过核心服务在tridion中创建一个MM组件,但是我收到错误来运行这个服务,
public ComponentData GetNewMultimediaComponent(CoreServiceClient Client, string folderUri, string schemaUri, string title, FileInfo fi)
{
if (fi.Extension == ".png")
{
string mmType = GetMultiMediaType(fi.Extension);
if (mmType != null)
{
string tempLocation = "";
UploadResponse us = new UploadResponse();
using (StreamUploadClient streamClient = GetConnection())
{
FileStream objfilestream = new FileStream(fi.FullName, FileMode.Open, FileAccess.Read);
tempLocation = streamClient.UploadBinaryContent(fi.Name.ToLower(), objfilestream);
}
BinaryContentData bcd = new BinaryContentData
{
UploadFromFile = fi.FullName,
MultimediaType = new LinkToMultimediaTypeData { IdRef = mmType },
Filename = fi.Name,
IsExternal = false
};
ComponentData res = GetNewComponent(folderUri, schemaUri, title);
res.ComponentType = ComponentType.Multimedia;
res.BinaryContent = bcd;
res = (ComponentData)Client.Create(res, new ReadOptions());
在上面的代码中,我在下面的行中收到错误
using (StreamUploadClient streamClient = new StreamUploadClient())
{System.InvalidOperationException: Could not find default endpoint element that references contract 'Tridion.ContentManager.CoreService.Client.IStreamUpload' in the ServiceModel client configuration section. This might be because no configuration file was found for your application, or because no endpoint element matching this contract could be found in the client element.
at System.ServiceModel.Description.ConfigLoader.LoadChannelBehaviors(ServiceEndpoint serviceEndpoint, String configurationName)
at System.ServiceModel.ChannelFactory.ApplyConfiguration(String configurationName, Configuration configuration)
at System.ServiceModel.ChannelFactory.ApplyConfiguration(String configurationName)
at System.ServiceModel.ChannelFactory.InitializeEndpoint(String configurationName, EndpointAddress address)
at System.ServiceModel.ChannelFactory`1..ctor(String endpointConfigurationName, EndpointAddress remoteAddress)
at System.ServiceModel.EndpointTrait`1.CreateSimplexFactory()
at System.ServiceModel.ClientBase`1.CreateChannelFactoryRef(EndpointTrait`1 endpointTrait).......
只是为了更新,我使用没有配置文件的DLL的tridion核心服务并成功创建连接。
连接设置
public StreamUploadClient GetConnection()
{
BasicHttpBinding basicHttpBinding = new BasicHttpBinding
{
MaxReceivedMessageSize = 10485760,
ReaderQuotas = new XmlDictionaryReaderQuotas
{
MaxStringContentLength = 10485760,
MaxArrayLength = 10485760
},
Security = new BasicHttpSecurity
{
Mode = BasicHttpSecurityMode.None,
}
};
EndpointAddress remoteAddress = new EndpointAddress("http://abc/webservices/CoreService2011.svc/streamUpload_basicHttp");
StreamUploadClient client = new StreamUploadClient(basicHttpBinding, remoteAddress);
try
{
client.Open();
}
catch (Exception ex)
{
//log.Error("Error:CoreServiceConectionOpen:Common:" + ex.Message);
throw ex;
}
return client;
}
现在,在线下面出现错误
tempLocation = streamClient.UploadBinaryContent(fi.Name.ToLower(), objfilestream);
{System.ServiceModel.ProtocolException: The content type multipart/related; type="application/xop+xml";start="<http://tempuri.org/0>";boundary="uuid:739a821f-aee2-4eaf-9206-05a1ed19311c+id=1";start-info="text/xml" of the response message does not match the content type of the binding (text/xml; charset=utf-8). If using a custom encoder, be sure that the IsContentTypeSupported method is implemented properly. The first 560 bytes of the response were: '
--uuid:739a821f-aee2-4eaf-9206-05a1ed19311c+id=1
Content-ID: <http://tempuri.org/0>
Content-Transfer-Encoding: 8bit
Content-Type: application/xop+xml;charset=utf-8;type="text/xml"
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Header><h:FilePath xmlns:h="http://www.sdltridion.com/ContentManager/CoreService/2011">C:\Windows\TEMP\tmp6841.png</h:FilePath></s:Header><s:Body><UploadResponse xmlns="http://www.sdltridion.com/ContentManager/CoreService/2011"/></s:Body></s:Envelope>
--uuid:739a821f-aee2-4eaf-9206-05a1ed19311c+id=1--
'.
任何人都可以帮我解决这个问题吗?
答案 0 :(得分:4)
问题出在这一行:
StreamUploadClient streamClient = new StreamUploadClient()
这是您尝试连接的单独端点。通常它会从app.config中选择地址和连接的所有其他属性,但是因为你没有任何需要自己提供所有必需的参数,类似于你对CoreService的处理。请参阅app.config示例以查看您需要的参数。
这样的事情:
public StreamUploadClient GetConnection()
{
BasicHttpBinding basicHttpBinding = new BasicHttpBinding
{
MaxReceivedMessageSize = 10485760,
ReaderQuotas = new XmlDictionaryReaderQuotas
{
MaxStringContentLength = 10485760,
MaxArrayLength = 10485760
},
MessageEncoding = WSMessageEncoding.Mtom,
Security = new BasicHttpSecurity
{
Mode = BasicHttpSecurityMode.None,
}
};
EndpointAddress remoteAddress = new EndpointAddress("http://abc/webservices/CoreService2011.svc/streamUpload_basicHttp");
StreamUploadClient client = new StreamUploadClient (basicHttpBinding, remoteAddress);
try
{
client.Open();
}
catch (Exception ex)
{
log.Error("Error:CoreServiceConectionOpen:Common:" + ex.Message);
throw ex;
}
return client;
}